Re: [PATCH] hotplug: Optimize {get,put}_online_cpus()

From: Steven Rostedt
Date: Mon Sep 23 2013 - 10:50:30 EST


On Thu, 19 Sep 2013 16:32:41 +0200
Peter Zijlstra <peterz@xxxxxxxxxxxxx> wrote:


> +extern void __get_online_cpus(void);
> +
> +static inline void get_online_cpus(void)
> +{
> + might_sleep();
> +
> + preempt_disable();
> + if (likely(!__cpuhp_writer || __cpuhp_writer == current))
> + this_cpu_inc(__cpuhp_refcount);
> + else
> + __get_online_cpus();
> + preempt_enable();
> +}


This isn't much different than srcu_read_lock(). What about doing
something like this:

static inline void get_online_cpus(void)
{
might_sleep();

srcu_read_lock(&cpuhp_srcu);
if (unlikely(__cpuhp_writer || __cpuhp_writer != current)) {
srcu_read_unlock(&cpuhp_srcu);
__get_online_cpus();
current->online_cpus_held++;
}
}

static inline void put_online_cpus(void)
{
if (unlikely(current->online_cpus_held)) {
current->online_cpus_held--;
__put_online_cpus();
return;
}

srcu_read_unlock(&cpuhp_srcu);
}

Then have the writer simply do:

__cpuhp_write = current;
synchronize_srcu(&cpuhp_srcu);

<grab the mutex here>

-- Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/