Messages in this thread | | | Date | Tue, 22 May 2012 10:27:14 -0700 | From | "Paul E. McKenney" <> | Subject | Re: [PATCH 17/41] rcu: Restart tick if we enqueue a callback in a nohz/cpuset CPU |
| |
On Tue, May 01, 2012 at 01:54:51AM +0200, Frederic Weisbecker wrote: > If we enqueue an rcu callback, we need the CPU tick to stay > alive until we take care of those by completing the appropriate > grace period. > > Thus, when we call_rcu(), send a self IPI that checks rcu_needs_cpu() > so that we restore a periodic tick behaviour that can take care of > everything.
Ouch, I hadn't considered RCU callbacks being posted from within an extended quiescent state. I guess I need to make __call_rcu() either complain about this or handle it correctly... It would -usually- be harmless, but there is getting to be quite a bit of active machinery in the various idle loops, so just assuming that it cannot happen is probably getting to be an obsolete assumption.
Thanx, Paul
> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> > Cc: Alessio Igor Bogani <abogani@kernel.org> > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: Avi Kivity <avi@redhat.com> > Cc: Chris Metcalf <cmetcalf@tilera.com> > Cc: Christoph Lameter <cl@linux.com> > Cc: Daniel Lezcano <daniel.lezcano@linaro.org> > Cc: Geoff Levand <geoff@infradead.org> > Cc: Gilad Ben Yossef <gilad@benyossef.com> > Cc: Hakan Akkan <hakanakkan@gmail.com> > Cc: Ingo Molnar <mingo@kernel.org> > Cc: Kevin Hilman <khilman@ti.com> > Cc: Max Krasnyansky <maxk@qualcomm.com> > Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> > Cc: Peter Zijlstra <peterz@infradead.org> > Cc: Stephen Hemminger <shemminger@vyatta.com> > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Sven-Thorsten Dietrich <thebigcorporation@gmail.com> > Cc: Thomas Gleixner <tglx@linutronix.de> > --- > kernel/rcutree.c | 7 +++++++ > 1 files changed, 7 insertions(+), 0 deletions(-) > > diff --git a/kernel/rcutree.c b/kernel/rcutree.c > index 3fffc26..b8d300c 100644 > --- a/kernel/rcutree.c > +++ b/kernel/rcutree.c > @@ -1749,6 +1749,13 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu), > else > trace_rcu_callback(rsp->name, head, rdp->qlen); > > + /* Restart the timer if needed to handle the callbacks */ > + if (cpuset_adaptive_nohz()) { > + /* Make updates on nxtlist visible to self IPI */ > + barrier(); > + smp_cpuset_update_nohz(smp_processor_id()); > + } > + > /* If interrupts were disabled, don't dive into RCU core. */ > if (irqs_disabled_flags(flags)) { > local_irq_restore(flags); > -- > 1.7.5.4 >
| |