• Andrew Morton's avatar
    [PATCH] cond_resched() fix · e7b38404
    Andrew Morton authored
    Fix a bug identified by Zou Nan hai <nanhai.zou@intel.com>:
    
    If the system is in state SYSTEM_BOOTING, and need_resched() is true,
    cond_resched() returns true even though it didn't reschedule.  Consequently
    need_resched() remains true and JBD locks up.
    
    Fix that by teaching cond_resched() to only return true if it really did call
    schedule().
    
    cond_resched_lock() and cond_resched_softirq() have a problem too.  If we're
    in SYSTEM_BOOTING state and need_resched() is true, these functions will drop
    the lock and will then try to call schedule(), but the SYSTEM_BOOTING state
    will prevent schedule() from being called.  So on return, need_resched() will
    still be true, but cond_resched_lock() has to return 1 to tell the caller that
    the lock was dropped.  The caller will probably lock up.
    
    Bottom line: if these functions dropped the lock, they _must_ call schedule()
    to clear need_resched().   Make it so.
    
    Also, uninline __cond_resched().  It's largeish, and slowpath.
    Acked-by: default avatarIngo Molnar <mingo@elte.hu>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    e7b38404
sched.c 169 KB