• Ingo Molnar's avatar
    [PATCH] sched: fix cond_resched_softirq() offset · 9414232f
    Ingo Molnar authored
    Remove the __resched_legal() check: it is conceptually broken.  The biggest
    problem it had is that it can mask buggy cond_resched() calls.  A
    cond_resched() call is only legal if we are not in an atomic context, with
    two narrow exceptions:
    
     - if the system is booting
     - a reacquire_kernel_lock() down() done while PREEMPT_ACTIVE is set
    
    But __resched_legal() hid this and just silently returned whenever
    these primitives were called from invalid contexts. (Same goes for
    cond_resched_locked() and cond_resched_softirq()).
    
    Furthermore, the __legal_resched(0) call was buggy in that it caused
    unnecessarily long softirq latencies via cond_resched_softirq().  (which is
    only called from softirq-off sections, hence the code did nothing.)
    
    The fix is to resurrect the efficiency of the might_sleep checks and to
    only allow the narrow exceptions.
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    9414232f
sched.c 177 KB