On Mon, Sep 23, 2013 at 10:50:17AM -0400, Steven Rostedt wrote: > On Thu, 19 Sep 2013 16:32:41 +0200 > Peter Zijlstra <pet...@infradead.org> 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++; > } > }
There's a full memory barrier in srcu_read_lock(), while there was no such thing in the previous fast path. Also, why current->online_cpus_held()? That would make the write side O(nr_tasks) instead of O(nr_cpus). > 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); > } Also, you might not have noticed but, srcu_read_{,un}lock() have an extra idx thing to pass about. That doesn't fit with the hotplug api. > > Then have the writer simply do: > > __cpuhp_write = current; > synchronize_srcu(&cpuhp_srcu); > > <grab the mutex here> How does that do reader preference? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/