On 18 February 2013 15:38, Frederic Weisbecker <fweis...@gmail.com> wrote: > 2013/2/18 Frederic Weisbecker <fweis...@gmail.com>: >> 2013/2/8 Vincent Guittot <vincent.guit...@linaro.org>: >>> On 8 February 2013 16:35, Frederic Weisbecker <fweis...@gmail.com> wrote: >>>> What if the following happen (inventing function names but you get the >>>> idea): >>>> >>>> CPU 0 CPU 1 >>>> >>>> dom = new_domain(...) { >>>> nr_cpus_busy = 0; >>>> set_idle(CPU 1); old_dom =get_dom() >>>> clear_idle(CPU 1) >>>> } >>>> rcu_assign_pointer(cpu1_dom, dom); >>>> >>>> >>>> Can this scenario happen? >>> >>> This scenario will be: >>> >>> CPU 0 CPU 1 >>> >>> detach_and_destroy_domain { >>> rcu_assign_pointer(cpu1_dom, NULL); >>> } >>> >>> dom = new_domain(...) { >>> nr_cpus_busy = 0; >>> set_idle(CPU 1); old_dom =get_dom() >>> old_dom is null >>> //clear_idle(CPU >>> 1) can't happen because a null domain is attached so we will never >>> call nohz_kick_needed which is the only place where we can clear_idle >>> } >>> rcu_assign_pointer(cpu1_dom, dom); >> >> So is the following possible? >> >> = CPU 0 = = CPU 1= >> >> detach_and_destroy_domain { >> rcu_assign_pointer(cpu1_dom, NULL); >> } >> >> dom = new_domain(...) { >> nr_cpus_busy = 0; >> set_idle(CPU 1); >> } >> >> clear_idle(CPU 1) >> >> dom = rcu_dereference(cpu1_dom) >> >> //dom == NULL, return >> >> rcu_assign_pointer(cpu1_dom, NULL); >> >> >> set_idle(CPU 1) >> >> dom = rcu_dereference(cpu1_dom) >> >> //dec nr_cpus_busy, making it negative > > Sorry, gmail messed up as usual. > > I pasted the original at: http://pastebin.com/DMm5U8J8
We can clear the idle flag only in the nohz_kick_needed which will not be called if the sched_domain is NULL so the sequence will be = CPU 0 = = CPU 1= detach_and_destroy_domain { rcu_assign_pointer(cpu1_dom, NULL); } dom = new_domain(...) { nr_cpus_busy = 0; set_idle(CPU 1); } dom = rcu_dereference(cpu1_dom) //dom == NULL, return rcu_assign_pointer(cpu1_dom, dom); dom = rcu_dereference(cpu1_dom) //dom != NULL, nohz_kick_needed { set_idle(CPU 1) dom = rcu_dereference(cpu1_dom) //dec nr_cpus_busy, } Vincent _______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev