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 _______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev