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

2013-10-02 Thread Paul E. McKenney
On Wed, Oct 02, 2013 at 04:00:20PM +0200, Oleg Nesterov wrote: > On 10/02, Peter Zijlstra wrote: > > > > On Wed, Oct 02, 2013 at 02:13:56PM +0200, Oleg Nesterov wrote: > > > In short: unless a gp elapses between _exit() and _enter(), the next > > > _enter() does nothing and avoids synchronize_sched

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

2013-10-02 Thread Oleg Nesterov
On 10/02, Peter Zijlstra wrote: > > On Wed, Oct 02, 2013 at 04:00:20PM +0200, Oleg Nesterov wrote: > > And again, even > > > > for (;;) { > > percpu_down_write(); > > percpu_up_write(); > > } > > > > should not completely block the readers. > > Sure there's a tiny wi

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

2013-10-02 Thread Peter Zijlstra
On Wed, Oct 02, 2013 at 04:00:20PM +0200, Oleg Nesterov wrote: > And again, even > > for (;;) { > percpu_down_write(); > percpu_up_write(); > } > > should not completely block the readers. Sure there's a tiny window, but don't forget that a reader will hav

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

2013-10-02 Thread Oleg Nesterov
On 10/02, Peter Zijlstra wrote: > > On Wed, Oct 02, 2013 at 02:13:56PM +0200, Oleg Nesterov wrote: > > In short: unless a gp elapses between _exit() and _enter(), the next > > _enter() does nothing and avoids synchronize_sched(). > > That does however make the entire scheme entirely writer biased;

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

2013-10-02 Thread Peter Zijlstra
On Wed, Oct 02, 2013 at 02:13:56PM +0200, Oleg Nesterov wrote: > In short: unless a gp elapses between _exit() and _enter(), the next > _enter() does nothing and avoids synchronize_sched(). That does however make the entire scheme entirely writer biased; increasing the need for the waitcount thing

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

2013-10-02 Thread Peter Zijlstra
On Wed, Oct 02, 2013 at 02:13:56PM +0200, Oleg Nesterov wrote: > On 10/02, Peter Zijlstra wrote: > > And given the construct; I'm not entirely sure you can do away with the > > sync_sched() in between. While its clear to me you can merge the two > > into one; leaving it out entirely doesn't seem ri

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

2013-10-02 Thread Oleg Nesterov
On 10/01, Paul E. McKenney wrote: > > On Tue, Oct 01, 2013 at 08:07:50PM +0200, Oleg Nesterov wrote: > > On 10/01, Peter Zijlstra wrote: > > > > > > On Tue, Oct 01, 2013 at 07:45:08PM +0200, Oleg Nesterov wrote: > > > > > > > > I tend to agree with Srivatsa... Without a strong reason it would be >

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

2013-10-02 Thread Oleg Nesterov
On 10/02, Peter Zijlstra wrote: > > On Tue, Oct 01, 2013 at 08:07:50PM +0200, Oleg Nesterov wrote: > > > > But note that you do not strictly need this change. Just kill > > > > cpuhp_waitcount, > > > > then we can change cpu_hotplug_begin/end to use xxx_enter/exit we > > > > discuss in > > > > an

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

2013-10-02 Thread Srivatsa S. Bhat
On 10/01/2013 11:44 PM, Srivatsa S. Bhat wrote: > On 10/01/2013 11:06 PM, Peter Zijlstra wrote: >> On Tue, Oct 01, 2013 at 10:41:15PM +0530, Srivatsa S. Bhat wrote: >>> However, as Oleg said, its definitely worth considering whether this >>> proposed >>> change in semantics is going to hurt us in

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

2013-10-02 Thread Peter Zijlstra
On Tue, Oct 01, 2013 at 08:07:50PM +0200, Oleg Nesterov wrote: > > > But note that you do not strictly need this change. Just kill > > > cpuhp_waitcount, > > > then we can change cpu_hotplug_begin/end to use xxx_enter/exit we discuss > > > in > > > another thread, this should likely "join" all sy

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

2013-10-01 Thread Paul E. McKenney
On Thu, Sep 26, 2013 at 01:10:42PM +0200, Peter Zijlstra wrote: > On Wed, Sep 25, 2013 at 02:22:00PM -0700, Paul E. McKenney wrote: > > A couple of nits and some commentary, but if there are races, they are > > quite subtle. ;-) > > *whee*.. > > I made one little change in the logic; I moved the

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

2013-10-01 Thread Paul E. McKenney
On Tue, Oct 01, 2013 at 08:07:50PM +0200, Oleg Nesterov wrote: > On 10/01, Peter Zijlstra wrote: > > > > On Tue, Oct 01, 2013 at 07:45:08PM +0200, Oleg Nesterov wrote: > > > > > > I tend to agree with Srivatsa... Without a strong reason it would be > > > better > > > to preserve the current logic:

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

2013-10-01 Thread Srivatsa S. Bhat
On 10/01/2013 11:26 PM, Peter Zijlstra wrote: > On Tue, Oct 01, 2013 at 07:45:08PM +0200, Oleg Nesterov wrote: >> On 10/01, Peter Zijlstra wrote: >>> >>> On Tue, Oct 01, 2013 at 10:41:15PM +0530, Srivatsa S. Bhat wrote: However, as Oleg said, its definitely worth considering whether this

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

2013-10-01 Thread Srivatsa S. Bhat
On 10/01/2013 11:44 PM, Srivatsa S. Bhat wrote: > On 10/01/2013 11:06 PM, Peter Zijlstra wrote: >> On Tue, Oct 01, 2013 at 10:41:15PM +0530, Srivatsa S. Bhat wrote: >>> However, as Oleg said, its definitely worth considering whether this >>> proposed >>> change in semantics is going to hurt us in

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

2013-10-01 Thread Srivatsa S. Bhat
On 10/01/2013 11:06 PM, Peter Zijlstra wrote: > On Tue, Oct 01, 2013 at 10:41:15PM +0530, Srivatsa S. Bhat wrote: >> However, as Oleg said, its definitely worth considering whether this proposed >> change in semantics is going to hurt us in the future. CPU_POST_DEAD has >> certainly >> proved to b

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

2013-10-01 Thread Oleg Nesterov
On 10/01, Peter Zijlstra wrote: > > On Tue, Oct 01, 2013 at 07:45:08PM +0200, Oleg Nesterov wrote: > > > > I tend to agree with Srivatsa... Without a strong reason it would be better > > to preserve the current logic: "some time after" should not be after the > > next CPU_DOWN/UP*. But I won't argu

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

2013-10-01 Thread Peter Zijlstra
On Tue, Oct 01, 2013 at 07:45:08PM +0200, Oleg Nesterov wrote: > On 10/01, Peter Zijlstra wrote: > > > > On Tue, Oct 01, 2013 at 10:41:15PM +0530, Srivatsa S. Bhat wrote: > > > However, as Oleg said, its definitely worth considering whether this > > > proposed > > > change in semantics is going to

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

2013-10-01 Thread Oleg Nesterov
On 10/01, Peter Zijlstra wrote: > > On Tue, Oct 01, 2013 at 10:41:15PM +0530, Srivatsa S. Bhat wrote: > > However, as Oleg said, its definitely worth considering whether this > > proposed > > change in semantics is going to hurt us in the future. CPU_POST_DEAD has > > certainly > > proved to be v

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

2013-10-01 Thread Peter Zijlstra
On Tue, Oct 01, 2013 at 10:41:15PM +0530, Srivatsa S. Bhat wrote: > However, as Oleg said, its definitely worth considering whether this proposed > change in semantics is going to hurt us in the future. CPU_POST_DEAD has > certainly > proved to be very useful in certain challenging situations (com

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

2013-10-01 Thread Srivatsa S. Bhat
On 10/01/2013 01:41 AM, Rafael J. Wysocki wrote: > On Saturday, September 28, 2013 06:31:04 PM Oleg Nesterov wrote: >> On 09/28, Peter Zijlstra wrote: >>> >>> On Sat, Sep 28, 2013 at 02:48:59PM +0200, Oleg Nesterov wrote: >>> Please note that this wait_event() adds a problem... it doesn't allo

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

2013-10-01 Thread Oleg Nesterov
On 10/01, Paul E. McKenney wrote: > > On Sun, Sep 29, 2013 at 03:56:46PM +0200, Oleg Nesterov wrote: > > On 09/27, Oleg Nesterov wrote: > > > > > > I tried hard to find any hole in this version but failed, I believe it > > > is correct. > > > > And I still believe it is. But now I am starting to th

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

2013-10-01 Thread Oleg Nesterov
On 10/01, Paul E. McKenney wrote: > > On Tue, Oct 01, 2013 at 04:48:20PM +0200, Peter Zijlstra wrote: > > On Tue, Oct 01, 2013 at 07:45:37AM -0700, Paul E. McKenney wrote: > > > If you don't have cpuhp_seq, you need some other way to avoid > > > counter overflow. Which might be provided by limited

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

2013-10-01 Thread Paul E. McKenney
On Sun, Sep 29, 2013 at 03:56:46PM +0200, Oleg Nesterov wrote: > On 09/27, Oleg Nesterov wrote: > > > > I tried hard to find any hole in this version but failed, I believe it > > is correct. > > And I still believe it is. But now I am starting to think that we > don't need cpuhp_seq. (and imo cpuh

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

2013-10-01 Thread Paul E. McKenney
On Tue, Oct 01, 2013 at 04:48:20PM +0200, Peter Zijlstra wrote: > On Tue, Oct 01, 2013 at 07:45:37AM -0700, Paul E. McKenney wrote: > > If you don't have cpuhp_seq, you need some other way to avoid > > counter overflow. Which might be provided by limited number of > > tasks, or, on 64-bit systems,

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

2013-10-01 Thread Oleg Nesterov
On 10/01, Paul E. McKenney wrote: > > On Tue, Oct 01, 2013 at 04:14:29PM +0200, Oleg Nesterov wrote: > > > > But please note another email, it seems to me we can simply kill > > cpuhp_seq and all the barriers in cpuhp_readers_active_check(). > > If you don't have cpuhp_seq, you need some other way

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

2013-10-01 Thread Peter Zijlstra
On Tue, Oct 01, 2013 at 07:45:37AM -0700, Paul E. McKenney wrote: > If you don't have cpuhp_seq, you need some other way to avoid > counter overflow. Which might be provided by limited number of > tasks, or, on 64-bit systems, 64-bit counters. How so? PID space is basically limited to 30 bits, so

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

2013-10-01 Thread Paul E. McKenney
On Tue, Oct 01, 2013 at 04:14:29PM +0200, Oleg Nesterov wrote: > On 09/30, Paul E. McKenney wrote: > > > > On Fri, Sep 27, 2013 at 10:41:16PM +0200, Peter Zijlstra wrote: > > > On Fri, Sep 27, 2013 at 08:15:32PM +0200, Oleg Nesterov wrote: > > > > On 09/26, Peter Zijlstra wrote: > > > > [ . . . ] >

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

2013-10-01 Thread Oleg Nesterov
On 09/30, Paul E. McKenney wrote: > > On Fri, Sep 27, 2013 at 10:41:16PM +0200, Peter Zijlstra wrote: > > On Fri, Sep 27, 2013 at 08:15:32PM +0200, Oleg Nesterov wrote: > > > On 09/26, Peter Zijlstra wrote: > > [ . . . ] > > > > > +static bool cpuhp_readers_active_check(void) > > > > { > > > > +

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

2013-09-30 Thread Paul E. McKenney
On Fri, Sep 27, 2013 at 10:41:16PM +0200, Peter Zijlstra wrote: > On Fri, Sep 27, 2013 at 08:15:32PM +0200, Oleg Nesterov wrote: > > On 09/26, Peter Zijlstra wrote: [ . . . ] > > > +static bool cpuhp_readers_active_check(void) > > > { > > > + unsigned int seq = per_cpu_sum(cpuhp_seq); > > > + >

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

2013-09-30 Thread Rafael J. Wysocki
On Saturday, September 28, 2013 06:31:04 PM Oleg Nesterov wrote: > On 09/28, Peter Zijlstra wrote: > > > > On Sat, Sep 28, 2013 at 02:48:59PM +0200, Oleg Nesterov wrote: > > > > > Please note that this wait_event() adds a problem... it doesn't allow > > > to "offload" the final synchronize_sched().

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

2013-09-29 Thread Oleg Nesterov
On 09/27, Oleg Nesterov wrote: > > I tried hard to find any hole in this version but failed, I believe it > is correct. And I still believe it is. But now I am starting to think that we don't need cpuhp_seq. (and imo cpuhp_waitcount, but this is minor). > We need to ensure 2 things: > > 1. The re

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

2013-09-28 Thread Paul E. McKenney
On Sat, Sep 28, 2013 at 02:48:59PM +0200, Oleg Nesterov wrote: > On 09/27, Peter Zijlstra wrote: > > > > On Fri, Sep 27, 2013 at 08:15:32PM +0200, Oleg Nesterov wrote: > > > > > > +static bool cpuhp_readers_active_check(void) > > > > { > > > > + unsigned int seq = per_cpu_sum(cpuhp_seq); > >

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

2013-09-28 Thread Oleg Nesterov
On 09/28, Peter Zijlstra wrote: > > On Sat, Sep 28, 2013 at 02:48:59PM +0200, Oleg Nesterov wrote: > > > Please note that this wait_event() adds a problem... it doesn't allow > > to "offload" the final synchronize_sched(). Suppose a 4k cpu machine > > does disable_nonboot_cpus(), we do not want 2 *

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

2013-09-28 Thread Peter Zijlstra
On Sat, Sep 28, 2013 at 02:48:59PM +0200, Oleg Nesterov wrote: > > > > void cpu_hotplug_done(void) > > > > { > ... > > > > + /* > > > > +* Wait for any pending readers to be running. This ensures > > > > readers > > > > +* after writer and avoids writers starving readers. >

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

2013-09-28 Thread Oleg Nesterov
On 09/27, Peter Zijlstra wrote: > > On Fri, Sep 27, 2013 at 08:15:32PM +0200, Oleg Nesterov wrote: > > > > +static bool cpuhp_readers_active_check(void) > > > { > > > + unsigned int seq = per_cpu_sum(cpuhp_seq); > > > + > > > + smp_mb(); /* B matches A */ > > > + > > > + /* > > > + * In other wor

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

2013-09-27 Thread Peter Zijlstra
On Fri, Sep 27, 2013 at 08:15:32PM +0200, Oleg Nesterov wrote: > On 09/26, Peter Zijlstra wrote: > > > > But if the readers does see BLOCK it will not be an active reader no > > more; and thus the writer doesn't need to observe and wait for it. > > I meant they both can block, but please ignore. T

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

2013-09-27 Thread Oleg Nesterov
On 09/26, Peter Zijlstra wrote: > > But if the readers does see BLOCK it will not be an active reader no > more; and thus the writer doesn't need to observe and wait for it. I meant they both can block, but please ignore. Today I simply can't understand what I was thinking about yesterday. I tri

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

2013-09-26 Thread Peter Zijlstra
On Thu, Sep 26, 2013 at 06:58:40PM +0200, Oleg Nesterov wrote: > Peter, > > Sorry. Unlikely I will be able to read this patch today. So let me > ask another potentially wrong question without any thinking. > > On 09/26, Peter Zijlstra wrote: > > > > +void __get_online_cpus(void) > > +{ > > +again

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

2013-09-26 Thread Oleg Nesterov
Peter, Sorry. Unlikely I will be able to read this patch today. So let me ask another potentially wrong question without any thinking. On 09/26, Peter Zijlstra wrote: > > +void __get_online_cpus(void) > +{ > +again: > + /* See __srcu_read_lock() */ > + __this_cpu_inc(__cpuhp_refcount); >

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

2013-09-26 Thread Peter Zijlstra
On Thu, Sep 26, 2013 at 06:14:26PM +0200, Oleg Nesterov wrote: > On 09/26, Peter Zijlstra wrote: > > > > On Thu, Sep 26, 2013 at 05:53:21PM +0200, Oleg Nesterov wrote: > > > On 09/26, Peter Zijlstra wrote: > > > > void cpu_hotplug_done(void) > > > > { > > > > - cpu_hotplug.active_writer = N

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

2013-09-26 Thread Oleg Nesterov
On 09/26, Peter Zijlstra wrote: > > On Thu, Sep 26, 2013 at 05:53:21PM +0200, Oleg Nesterov wrote: > > On 09/26, Peter Zijlstra wrote: > > > void cpu_hotplug_done(void) > > > { > > > - cpu_hotplug.active_writer = NULL; > > > - mutex_unlock(&cpu_hotplug.lock); > > > + /* Signal the writer is done,

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

2013-09-26 Thread Peter Zijlstra
On Thu, Sep 26, 2013 at 05:53:21PM +0200, Oleg Nesterov wrote: > On 09/26, Peter Zijlstra wrote: > > void cpu_hotplug_done(void) > > { > > - cpu_hotplug.active_writer = NULL; > > - mutex_unlock(&cpu_hotplug.lock); > > + /* Signal the writer is done, no fast path yet. */ > > + __cpuhp_stat

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

2013-09-26 Thread Peter Zijlstra
On Wed, Sep 25, 2013 at 02:22:00PM -0700, Paul E. McKenney wrote: > A couple of nits and some commentary, but if there are races, they are > quite subtle. ;-) *whee*.. I made one little change in the logic; I moved the waitcount increment to before the __put_online_cpus() call, such that the wri

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

2013-09-25 Thread Paul E. McKenney
On Wed, Sep 25, 2013 at 08:40:15PM +0200, Peter Zijlstra wrote: > On Wed, Sep 25, 2013 at 07:50:55PM +0200, Oleg Nesterov wrote: > > No. Too tired too ;) damn LSB test failures... > > > ok; I cobbled this together.. I might think better of it tomorrow, but > for now I think I closed the hole befo

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

2013-09-25 Thread Peter Zijlstra
On Wed, Sep 25, 2013 at 07:50:55PM +0200, Oleg Nesterov wrote: > No. Too tired too ;) damn LSB test failures... ok; I cobbled this together.. I might think better of it tomorrow, but for now I think I closed the hole before wait_event(readers_active()) you pointed out -- of course I might have cr

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

2013-09-25 Thread Oleg Nesterov
On 09/25, Peter Zijlstra wrote: > > On Wed, Sep 25, 2013 at 05:55:15PM +0200, Oleg Nesterov wrote: > > > > +static inline void get_online_cpus(void) > > > +{ > > > + might_sleep(); > > > + > > > + /* Support reader-in-reader recursion */ > > > + if (current->cpuhp_ref++) { > > > + barrier()

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

2013-09-25 Thread Peter Zijlstra
On Wed, Sep 25, 2013 at 05:55:15PM +0200, Oleg Nesterov wrote: > On 09/24, Peter Zijlstra wrote: > > > > So now we drop from a no memory barriers fast path, into a memory > > barrier 'slow' path into blocking. > > Cough... can't understand the above ;) In fact I can't understand > the patch... see

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

2013-09-25 Thread Paul E. McKenney
On Wed, Sep 25, 2013 at 05:55:15PM +0200, Oleg Nesterov wrote: > On 09/24, Peter Zijlstra wrote: > > > > So now we drop from a no memory barriers fast path, into a memory > > barrier 'slow' path into blocking. > > Cough... can't understand the above ;) In fact I can't understand > the patch... see

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

2013-09-25 Thread Oleg Nesterov
On 09/25, Peter Zijlstra wrote: > > On Wed, Sep 25, 2013 at 05:16:42PM +0200, Oleg Nesterov wrote: > > > And in this case (I think) we do not care, we are already in the critical > > section. > > I tend to agree, however paranoia.. Ah, in this case I tend to agree. better be paranoid ;) Oleg. --

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

2013-09-25 Thread Oleg Nesterov
On 09/24, Peter Zijlstra wrote: > > So now we drop from a no memory barriers fast path, into a memory > barrier 'slow' path into blocking. Cough... can't understand the above ;) In fact I can't understand the patch... see below. But in any case, afaics the fast path needs mb() unless you add anoth

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

2013-09-25 Thread Peter Zijlstra
On Wed, Sep 25, 2013 at 05:16:42PM +0200, Oleg Nesterov wrote: > Yes, but my point was, this can only happen in recursive fast path. Right, I understood. > And in this case (I think) we do not care, we are already in the critical > section. I tend to agree, however paranoia.. > OK, please forge

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

2013-09-25 Thread Oleg Nesterov
On 09/24, Peter Zijlstra wrote: > > On Tue, Sep 24, 2013 at 08:00:05PM +0200, Oleg Nesterov wrote: > > > > Yes, we need to ensure gcc doesn't reorder this code so that > > do_something() comes before get_online_cpus(). But it can't? At least > > it should check current->cpuhp_ref != 0 first? And if

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

2013-09-24 Thread Paul E. McKenney
On Tue, Sep 24, 2013 at 06:09:59PM +0200, Peter Zijlstra wrote: > On Tue, Sep 24, 2013 at 07:42:36AM -0700, Paul E. McKenney wrote: > > > +#define cpuhp_writer_wake() > > > \ > > > + wake_up_process(cpuhp_writer_task) > > > + > > > +#define cpuhp_writer

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

2013-09-24 Thread Peter Zijlstra
On Tue, Sep 24, 2013 at 10:24:23PM +0200, Peter Zijlstra wrote: > +void __get_online_cpus(void) > +{ > + if (__cpuhp_writer == 1) { take_ref: > + /* See __srcu_read_lock() */ > + __this_cpu_inc(__cpuhp_refcount); > + smp_mb(); > + __this_cpu_inc(c

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

2013-09-24 Thread Peter Zijlstra
On Tue, Sep 24, 2013 at 08:00:05PM +0200, Oleg Nesterov wrote: > On 09/24, Paul E. McKenney wrote: > > > > On Tue, Sep 24, 2013 at 07:06:31PM +0200, Oleg Nesterov wrote: > > > > > > If gcc can actually do something wrong, then I suspect this barrier() > > > should be unconditional. > > > > If you a

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

2013-09-24 Thread Peter Zijlstra
On Mon, Sep 23, 2013 at 07:32:03PM +0200, Oleg Nesterov wrote: > > static void cpuhp_wait_refcount(void) > > { > > for (;;) { > > unsigned int rc1, rc2; > > > > rc1 = cpuhp_refcount(); > > set_current_state(TASK_UNINTERRUPTIBLE); /* MB */ > > rc2

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

2013-09-24 Thread Oleg Nesterov
On 09/24, Paul E. McKenney wrote: > > On Tue, Sep 24, 2013 at 07:06:31PM +0200, Oleg Nesterov wrote: > > > > If gcc can actually do something wrong, then I suspect this barrier() > > should be unconditional. > > If you are saying that there should be a barrier() on all return paths > from get_onlin

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

2013-09-24 Thread Paul E. McKenney
On Tue, Sep 24, 2013 at 07:06:31PM +0200, Oleg Nesterov wrote: > On 09/24, Steven Rostedt wrote: > > > > On Tue, 24 Sep 2013 18:03:59 +0200 > > Oleg Nesterov wrote: > > > > > On 09/24, Peter Zijlstra wrote: > > > > > > > > +static inline void get_online_cpus(void) > > > > +{ > > > > + might_

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

2013-09-24 Thread Oleg Nesterov
On 09/24, Steven Rostedt wrote: > > On Tue, 24 Sep 2013 18:03:59 +0200 > Oleg Nesterov wrote: > > > On 09/24, Peter Zijlstra wrote: > > > > > > +static inline void get_online_cpus(void) > > > +{ > > > + might_sleep(); > > > + > > > + if (current->cpuhp_ref++) { > > > + barrier(); > > > +

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

2013-09-24 Thread Oleg Nesterov
On 09/24, Peter Zijlstra wrote: > > On Tue, Sep 24, 2013 at 09:49:00AM -0700, Paul E. McKenney wrote: > > > > void cpu_hotplug_done(void) > > > > { > > > > + /* Signal the writer is done */ > > > > + cpuhp_writer = 0; > > > > + wake_up_all(&cpuhp_wq); > > > > + > > > > + /

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

2013-09-24 Thread Peter Zijlstra
On Tue, Sep 24, 2013 at 09:49:00AM -0700, Paul E. McKenney wrote: > > > void cpu_hotplug_done(void) > > > { > > > + /* Signal the writer is done */ > > > + cpuhp_writer = 0; > > > + wake_up_all(&cpuhp_wq); > > > + > > > + /* Wait for any pending readers to be running */ > > > + cpuhp_writer_wait(

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

2013-09-24 Thread Peter Zijlstra
On Tue, Sep 24, 2013 at 06:03:59PM +0200, Oleg Nesterov wrote: > On 09/24, Peter Zijlstra wrote: > > > > +static inline void get_online_cpus(void) > > +{ > > + might_sleep(); > > + > > + if (current->cpuhp_ref++) { > > + barrier(); > > + return; > > I don't undestand this b

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

2013-09-24 Thread Paul E. McKenney
On Tue, Sep 24, 2013 at 06:03:59PM +0200, Oleg Nesterov wrote: > On 09/24, Peter Zijlstra wrote: > > > > +static inline void get_online_cpus(void) > > +{ > > + might_sleep(); > > + > > + if (current->cpuhp_ref++) { > > + barrier(); > > + return; > > I don't undestand this b

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

2013-09-24 Thread Steven Rostedt
On Tue, 24 Sep 2013 18:03:59 +0200 Oleg Nesterov wrote: > On 09/24, Peter Zijlstra wrote: > > > > +static inline void get_online_cpus(void) > > +{ > > + might_sleep(); > > + > > + if (current->cpuhp_ref++) { > > + barrier(); > > + return; > > I don't undestand this barrie

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

2013-09-24 Thread Steven Rostedt
On Tue, 24 Sep 2013 14:38:21 +0200 Peter Zijlstra wrote: > +#define cpuhp_writer_wait(cond) > \ > +do { \ > + for (;;) { \ > +

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

2013-09-24 Thread Oleg Nesterov
On 09/24, Peter Zijlstra wrote: > > +void __get_online_cpus(void) > { > - if (cpu_hotplug.active_writer == current) > + /* Support reader-in-writer recursion */ > + if (__cpuhp_writer == current) > return; > - mutex_lock(&cpu_hotplug.lock); > > - if (WARN_ON(!cp

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

2013-09-24 Thread Oleg Nesterov
On 09/24, Peter Zijlstra wrote: > > +static inline void get_online_cpus(void) > +{ > + might_sleep(); > + > + if (current->cpuhp_ref++) { > + barrier(); > + return; I don't undestand this barrier()... we are going to return if we already hold the lock, do we really

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

2013-09-24 Thread Peter Zijlstra
On Tue, Sep 24, 2013 at 07:42:36AM -0700, Paul E. McKenney wrote: > > +#define cpuhp_writer_wake() > > \ > > + wake_up_process(cpuhp_writer_task) > > + > > +#define cpuhp_writer_wait(cond) > > \ > > +do {

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

2013-09-24 Thread Paul E. McKenney
On Tue, Sep 24, 2013 at 02:38:21PM +0200, Peter Zijlstra wrote: > > OK, so another attempt. > > This one is actually fair in that it immediately forces a reader > quiescent state by explicitly implementing reader-reader recursion. > > This does away with the potentially long pending writer case

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

2013-09-24 Thread Peter Zijlstra
OK, so another attempt. This one is actually fair in that it immediately forces a reader quiescent state by explicitly implementing reader-reader recursion. This does away with the potentially long pending writer case and can thus use the simpler global state. I don't really like this lock bein

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

2013-09-23 Thread Paul E. McKenney
On Mon, Sep 23, 2013 at 06:01:30PM +0200, Peter Zijlstra wrote: > On Mon, Sep 23, 2013 at 08:50:59AM -0700, Paul E. McKenney wrote: > > Not a problem, just stuff the idx into some per-task thing. Either > > task_struct or taskinfo will work fine. > > Still not seeing the point of using srcu thoug

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

2013-09-23 Thread Oleg Nesterov
And somehow I didn't notice that cpuhp_set_state() doesn't look right, On 09/19, Peter Zijlstra wrote: > void cpu_hotplug_begin(void) > { > - cpu_hotplug.active_writer = current; > + lockdep_assert_held(&cpu_add_remove_lock); > > - for (;;) { > - mutex_lock(&cpu_hotplug

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

2013-09-23 Thread Peter Zijlstra
On Mon, Sep 23, 2013 at 10:04:00AM -0700, Paul E. McKenney wrote: > At some point I suspect that we will want some form of fairness, but in > the meantime, good point. I figured we could start a timer on hotplug to force quiesce the readers after about 10 minutes or so ;-) Should be a proper disc

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

2013-09-23 Thread Oleg Nesterov
On 09/23, Peter Zijlstra wrote: > > On Sat, Sep 21, 2013 at 06:34:04PM +0200, Oleg Nesterov wrote: > > > So the slow path is still per-cpu and mostly uncontended even in the > > > pending writer case. > > > > Is it really important? I mean, per-cpu/uncontended even if the writer > > is pending? > >

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

2013-09-23 Thread Peter Zijlstra
On Mon, Sep 23, 2013 at 11:59:08AM -0400, Steven Rostedt wrote: > On Mon, 23 Sep 2013 17:22:23 +0200 > Peter Zijlstra wrote: > > > Still no point in using srcu for this; preempt_disable + > > synchronize_sched() is similar and much faster -- its the rcu_sched > > equivalent of what you propose. >

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

2013-09-23 Thread Steven Rostedt
On Mon, 23 Sep 2013 17:22:23 +0200 Peter Zijlstra wrote: > Still no point in using srcu for this; preempt_disable + > synchronize_sched() is similar and much faster -- its the rcu_sched > equivalent of what you propose. To be honest, I sent this out last week and it somehow got trashed by my lap

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

2013-09-23 Thread Peter Zijlstra
On Mon, Sep 23, 2013 at 08:50:59AM -0700, Paul E. McKenney wrote: > Not a problem, just stuff the idx into some per-task thing. Either > task_struct or taskinfo will work fine. Still not seeing the point of using srcu though.. srcu_read_lock() vs synchronize_srcu() is the same but far more expen

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

2013-09-23 Thread Paul E. McKenney
On Mon, Sep 23, 2013 at 11:13:03AM -0400, Steven Rostedt wrote: > On Mon, 23 Sep 2013 16:54:46 +0200 > Peter Zijlstra wrote: > > > On Mon, Sep 23, 2013 at 10:50:17AM -0400, Steven Rostedt wrote: [ . . . ] > ?? I'm not sure I understand this. The online_cpus_held++ was there for > recursion. Can

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

2013-09-23 Thread Peter Zijlstra
On Mon, Sep 23, 2013 at 11:13:03AM -0400, Steven Rostedt wrote: > Well, the point I was trying to do was to let readers go very fast > (well, with a mb instead of a mutex), and then when the CPU hotplug > happens, it goes back to the current method. Well, for that the thing Oleg proposed works jus

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

2013-09-23 Thread Steven Rostedt
On Mon, 23 Sep 2013 16:54:46 +0200 Peter Zijlstra wrote: > On Mon, Sep 23, 2013 at 10:50:17AM -0400, Steven Rostedt wrote: > > On Thu, 19 Sep 2013 16:32:41 +0200 > > Peter Zijlstra wrote: > > > > > > > +extern void __get_online_cpus(void); > > > + > > > +static inline void get_online_cpus(void

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

2013-09-23 Thread Peter Zijlstra
On Mon, Sep 23, 2013 at 10:50:17AM -0400, Steven Rostedt wrote: > On Thu, 19 Sep 2013 16:32:41 +0200 > Peter Zijlstra wrote: > > > > +extern void __get_online_cpus(void); > > + > > +static inline void get_online_cpus(void) > > +{ > > + might_sleep(); > > + > > + preempt_disable(); > > + if

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

2013-09-23 Thread Steven Rostedt
On Thu, 19 Sep 2013 16:32:41 +0200 Peter Zijlstra 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_i

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

2013-09-23 Thread Peter Zijlstra
On Sat, Sep 21, 2013 at 06:34:04PM +0200, Oleg Nesterov wrote: > > So the slow path is still per-cpu and mostly uncontended even in the > > pending writer case. > > Is it really important? I mean, per-cpu/uncontended even if the writer > is pending? I think so, once we make {get,put}_online_cpus(

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

2013-09-21 Thread Oleg Nesterov
On 09/21, Oleg Nesterov wrote: > > As for the patch itself, I am not sure. Forgot to mention... and with this patch cpu_hotplug_done() loses the "release" semantics, not sure this is fine. Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message t

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

2013-09-21 Thread Oleg Nesterov
Sorry for delay, I was sick... On 09/19, Peter Zijlstra wrote: > > I used a per-cpu spinlock to keep the state check and refcount inc > atomic vs the setting of state. I think this could be simpler, see below. > So the slow path is still per-cpu and mostly uncontended even in the > pending write

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

2013-09-19 Thread Peter Zijlstra
Meh, I should stop poking at this.. This one lost all the comments again :/ It uses preempt_disable/preempt_enable vs synchronize_sched() to remove the barriers from the fast path. After that it waits for !refcount before setting state, which stops new readers. I used a per-cpu spinlock to k

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

2013-09-18 Thread Peter Zijlstra
New version, now with excessive comments. I found a deadlock (where both reader and writer would go to sleep); identified below as case 1b. The implementation without patch is reader biased, this implementation, as Mel pointed out, is writer biased. I should try and fix this but I'm stepping away

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

2013-09-17 Thread Peter Zijlstra
On Tue, Sep 17, 2013 at 05:20:50PM +0100, Mel Gorman wrote: > > +extern struct task_struct *__cpuhp_writer; > > +DECLARE_PER_CPU(unsigned int, __cpuhp_refcount); > > + > > +extern void __get_online_cpus(void); > > + > > +static inline void get_online_cpus(void) > > +{ > > + might_sleep(); > > + >

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

2013-09-17 Thread Mel Gorman
On Tue, Sep 17, 2013 at 04:30:03PM +0200, Peter Zijlstra wrote: > Subject: hotplug: Optimize {get,put}_online_cpus() > From: Peter Zijlstra > Date: Tue Sep 17 16:17:11 CEST 2013 > > The cpu hotplug lock is a purely reader biased read-write lock. > > The current implementation uses global state,

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

2013-09-17 Thread Peter Zijlstra
Subject: hotplug: Optimize {get,put}_online_cpus() From: Peter Zijlstra Date: Tue Sep 17 16:17:11 CEST 2013 The cpu hotplug lock is a purely reader biased read-write lock. The current implementation uses global state, change it so the reader side uses per-cpu state in the uncontended fast-path.