[lkml]   [2012]   [May]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[34-longterm 016/179] rcu: Fix unpaired rcu_irq_enter() from locking selftests
    From: Frederic Weisbecker <>

    This is a commit scheduled for the next v2.6.34 longterm release.
    If you see a problem with using this for longterm, please comment.

    commit ba9f207c9f82115aba4ce04b22e0081af0ae300f upstream.

    HARDIRQ_ENTER() maps to irq_enter() which calls rcu_irq_enter().
    But HARDIRQ_EXIT() maps to __irq_exit() which doesn't call

    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 dyntick-idle mode after leaving the interrupt
    handler. This means that RCU won't see the affected CPU as being
    in an extended quiescent state, resulting in long grace-period
    delays (as in grace periods extending for hours).

    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 makes 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 <>
    Signed-off-by: Frederic Weisbecker <>
    Cc: Paul E. McKenney <>
    Cc: Ingo Molnar <>
    Cc: Peter Zijlstra <>
    Signed-off-by: Paul E. McKenney <>
    Signed-off-by: Paul Gortmaker <>
    lib/locking-selftest.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    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(); \

    #define HARDIRQ_EXIT() \

     \ /
      Last update: 2012-05-15 05:41    [W:0.036 / U:29.344 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site