On Thu, 2012-10-11 at 10:00 +0900, Greg Kroah-Hartman wrote: > 3.4-stable review patch. If anyone has any objections, please let me know. > > ------------------ > > From: "Paul E. McKenney" > > commit a10d206ef1a83121ab7430cb196e0376a7145b22 upstream. [...] > This commit therefore makes CPUs check more carefully before starting a > new grace period. This new check relies on an array of tail pointers > into each CPU's list of callbacks. If the CPU is up to date on which > grace periods have completed, it checks to see if any callbacks follow > the RCU_DONE_TAIL segment, otherwise it checks to see if any callbacks > follow the RCU_WAIT_TAIL segment. The reason that this works is that > the RCU_WAIT_TAIL segment will be promoted to the RCU_DONE_TAIL segment > as soon as the CPU is officially notified that the old grace period > has ended. [...] > --- a/kernel/rcutree.c > +++ b/kernel/rcutree.c > @@ -295,7 +295,9 @@ cpu_has_callbacks_ready_to_invoke(struct > static int > cpu_needs_another_gp(struct rcu_state *rsp, struct rcu_data *rdp) > { > - return *rdp->nxttail[RCU_DONE_TAIL] && !rcu_gp_in_progress(rsp); > + return *rdp->nxttail[RCU_DONE_TAIL + > + ACCESS_ONCE(rsp->completed) != rdp->completed] && This is a very obscurely written expression. The array index is parsed as: (RCU_DONE_TAIL + ACCESS_ONCE(rsp->completed)) != rdp->completed Since RCU_DONE_TAIL == 0 and RCU_WAIT_TAIL == 1, this is then equivalent to: ACCESS_ONCE(rsp->completed) != rdp->completed or: (ACCESS_ONCE(rsp->completed) != rdp->completed) ? RCU_WAIT_TAIL : RCU_DONE_TAIL But whyever didn't you write that explicitly? Ben. > + !rcu_gp_in_progress(rsp); > } > > /* -- Ben Hutchings Kids! Bringing about Armageddon can be dangerous. Do not attempt it in your own home. - Terry Pratchett and Neil Gaiman, `Good Omens'