Messages in this thread | | | Date | Thu, 18 Aug 2011 18:21:08 -0400 | From | Josh Boyer <> | Subject | Re: 3.0-git15 Atomic scheduling in pidmap_init |
| |
On Thu, Aug 18, 2011 at 02:55:40PM -0700, Paul E. McKenney wrote: > And here is this patch ported to v3.1-rc2, FYI. > > Thanx, Paul > > ------------------------------------------------------------------------ > > rcu: Avoid having just-onlined CPU resched itself when RCU is idle > > CPUs set rdp->qs_pending when coming online to resolve races with > grace-period start. However, this means that if RCU is idle, the > just-onlined CPU might needlessly send itself resched IPIs. Adjust the > online-CPU initialization to avoid this, and also to correctly cause > the CPU to respond to the current grace period if needed. > > This patch is believed to fix or otherwise suppress problems in > https://bugzilla.redhat.com/show_bug.cgi?id=726877, however, the > relationship is not apparent to this patch's author. > > Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This is what has been in rawhide for a while now.
Tested-by: Josh Boyer <jwboyer@redhat.com>
> > diff --git a/kernel/rcutree.c b/kernel/rcutree.c > index ba06207..6986d34 100644 > --- a/kernel/rcutree.c > +++ b/kernel/rcutree.c > @@ -1865,8 +1865,6 @@ rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptible) > > /* Set up local state, ensuring consistent view of global state. */ > raw_spin_lock_irqsave(&rnp->lock, flags); > - rdp->passed_quiesc = 0; /* We could be racing with new GP, */ > - rdp->qs_pending = 1; /* so set up to respond to current GP. */ > rdp->beenonline = 1; /* We have now been online. */ > rdp->preemptible = preemptible; > rdp->qlen_last_fqs_check = 0; > @@ -1891,8 +1889,15 @@ rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptible) > rnp->qsmaskinit |= mask; > mask = rnp->grpmask; > if (rnp == rdp->mynode) { > - rdp->gpnum = rnp->completed; /* if GP in progress... */ > + /* > + * If there is a grace period in progress, we will > + * set up to wait for it next time we run the > + * RCU core code. > + */ > + rdp->gpnum = rnp->completed; > rdp->completed = rnp->completed; > + rdp->passed_quiesc = 0; > + rdp->qs_pending = 1; > rdp->passed_quiesc_completed = rnp->completed - 1; > } > raw_spin_unlock(&rnp->lock); /* irqs already disabled. */
| |