Re: [RFC PATCH 18/19] cpufreq: remove transition_lock

From: Peter Zijlstra
Date: Tue Jan 19 2016 - 14:21:24 EST


On Tue, Jan 19, 2016 at 08:17:34PM +0100, Peter Zijlstra wrote:
> On Tue, Jan 19, 2016 at 04:01:55PM +0000, Juri Lelli wrote:
> > Right, read path is fast, but write path still requires some sort of
> > locking (malloc, copy and update). So, I'm wondering if this still pays
> > off for a structure that gets written a lot.
>
> No, not at all.
>
> struct cpufreq_driver *driver;
>
> void sched_util_change(unsigned int util)
> {
> struct my_per_cpu_data *foo;
>
> rcu_read_lock();

That should obviously be:

d = rcu_dereference(driver);
if (d) {
foo = __this_cpu_ptr(d->data);

> if (abs(util - foo->last_util) > 10) {
> foo->last_util = util;
> foo->set_util(util);
> }
> }
> rcu_read_unlock();
> }
>
>
> struct cpufreq_driver *cpufreq_flip_driver(struct cpufreq_driver *new_driver)
> {
> struct cpufreq_driver *old_driver;
>
> mutex_lock(&cpufreq_driver_lock);
> old_driver = driver;
> rcu_assign_driver(driver, new_driver);
> if (old_driver)
> synchronize_rcu();
> mutex_unlock(&cpufreq_driver_lock);
>
> return old_driver;
> }
>
>
>