lkml.org 
[lkml]   [2007]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 09/54] Prevent going idle with softirq pending
    -stable review patch.  If anyone has any objections, please let us know.
    ---------------------

    From: Thomas Gleixner <tglx@linutronix.de>


    The NOHZ patch contains a check for softirqs pending when a CPU goes
    idle. The BUG is unrelated to NOHZ, it just was made visible by the NOHZ
    patch. The BUG showed up mainly on P4 / hyperthreading enabled machines
    which lead the investigations into the wrong direction in the first
    place. The real cause is in cond_resched_softirq():

    cond_resched_softirq() is enabling softirqs without invoking the softirq
    daemon when softirqs are pending. This leads to the warning message in
    the NOHZ idle code:

    t1 runs softirq disabled code on CPU#0
    interrupt happens, softirq is raised, but deferred (softirqs disabled)
    t1 calls cond_resched_softirq()
    enables softirqs via _local_bh_enable()
    calls schedule()
    t2 runs
    t1 is migrated to CPU#1
    t2 is done and invokes idle()
    NOHZ detects the pending softirq

    Fix: change _local_bh_enable() to local_bh_enable() so the softirq
    daemon is invoked.

    Thanks to Anant Nitya for debugging this with great patience !

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Cc: Anant Nitya <kernel@prachanda.info>
    Signed-off-by: Chris Wright <chrisw@sous-sol.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    ---
    kernel/sched.c | 4 +---
    1 file changed, 1 insertion(+), 3 deletions(-)

    --- linux-2.6.21.4.orig/kernel/sched.c
    +++ linux-2.6.21.4/kernel/sched.c
    @@ -4545,9 +4545,7 @@ int __sched cond_resched_softirq(void)
    BUG_ON(!in_softirq());

    if (need_resched() && system_state == SYSTEM_RUNNING) {
    - raw_local_irq_disable();
    - _local_bh_enable();
    - raw_local_irq_enable();
    + local_bh_enable();
    __cond_resched();
    local_bh_disable();
    return 1;
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-06-08 09:45    [W:0.020 / U:30.484 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site