On Fri, May 20, 2011 at 02:09:54AM +0200, Frederic Weisbecker wrote: > HARDIRQ_ENTER() maps to irq_enter() which calls rcu_irq_enter(). > But HARDIRQ_EXIT() maps to __irq_exit() which doesn't call > rcu_irq_exit(). > > So for every locking selftest that simulates hardirq disabled, > we create an imbalance in the rcu extended quiescent state > internal state. > > As a result, after the first missing rcu_irq_exit(), subsequent > irqs won't exit any extended quiescent state the time of the > interrupt servicing. Rcu read side critical section inside irqs > on that CPU won't be guaranteed anymore. > > To fix this, just use __irq_enter() to simulate the hardirq > context. This is sufficient for the locking selftests as we > don't need to exit any extended quiescent state or perform > any check that irqs normally do when they wake up from idle. > > As a side effect, this patch should make it possible to > restore > "rcu: Decrease memory-barrier usage based on semi-formal proof", > which eventually helped finding this bug. > > Reported-and-tested-by: Yinghai Lu <[email protected]> > Signed-off-by: Frederic Weisbecker <[email protected]> > Cc: Paul E. McKenney <[email protected]>
You know, I looked at this code, but failed to see __irq_exit() vs irq_enter()... Good catch, Frederic, and thanks to Yinghai and Ingo for all the testing! Reviewed-by: Paul E. McKenney <[email protected]> > Cc: Ingo Molnar <[email protected]> > Cc: Peter Zijlstra <[email protected]> > Cc: Stable <[email protected]> > --- > lib/locking-selftest.c | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c > index 619313e..507a22f 100644 > --- a/lib/locking-selftest.c > +++ b/lib/locking-selftest.c > @@ -144,7 +144,7 @@ static void init_shared_classes(void) > > #define HARDIRQ_ENTER() \ > local_irq_disable(); \ > - irq_enter(); \ > + __irq_enter(); \ > WARN_ON(!in_irq()); > > #define HARDIRQ_EXIT() \ > -- > 1.7.3.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to [email protected] > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ _______________________________________________ stable mailing list [email protected] http://linux.kernel.org/mailman/listinfo/stable
