• Thomas Gleixner's avatar
    sched: Make might_sleep() output less confusing · 8d713b69
    Thomas Gleixner authored
    
    
    might_sleep() output is pretty informative, but can be confusing at times
    especially with PREEMPT_RCU when the check triggers due to a voluntary
    sleep inside a RCU read side critical section:
    
     BUG: sleeping function called from invalid context at kernel/test.c:110
     in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 415, name: kworker/u112:52
     Preemption disabled at: migrate_disable+0x33/0xa0
    
    in_atomic() is 0, but it still tells that preemption was disabled at
    migrate_disable(), which is completely useless because preemption is not
    disabled. But the interesting information to decode the above, i.e. the RCU
    nesting depth, is not printed.
    
    That becomes even more confusing when might_sleep() is invoked from
    cond_resched_lock() within a RCU read side critical section. Here the
    expected preemption count is 1 and not 0.
    
     BUG: sleeping function called from invalid context at kernel/test.c:131
     in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 415, name: kworker/u112:52
     Preemption disabled at: test_cond_lock+0xf3/0x1c0
    
    So in_atomic() is set, which is expected as the caller holds a spinlock,
    but it's unclear why this is broken and the preempt disable IP is just
    pointing at the correct place, i.e. spin_lock(), which is obviously not
    helpful either.
    
    Make that more useful in general:
    
     - Print preempt_count() and the expected value
    
    and for the CONFIG_PREEMPT_RCU case:
    
     - Print the RCU read side critical section nesting depth
    
     - Print the preempt disable IP only when preempt count
       does not have the expected value.
    
    So the might_sleep() dump from a within a preemptible RCU read side
    critical section becomes:
    
     BUG: sleeping function called from invalid context at kernel/test.c:110
     in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 415, name: kworker/u112:52
     preempt_count: 0, expected: 0
     RCU nest depth: 1, expected: 0
    
    and the cond_resched_lock() case becomes:
    
     BUG: sleeping function called from invalid context at kernel/test.c:141
     in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 415, name: kworker/u112:52
     preempt_count: 1, expected: 1
     RCU nest depth: 1, expected: 0
    
    which makes is pretty obvious what's going on. For all other cases the
    preempt disable IP is still printed as before:
    
     BUG: sleeping function called from invalid context at kernel/test.c: 156
     in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1, name: swapper/0
     preempt_count: 1, expected: 0
     RCU nest depth: 0, expected: 0
     Preemption disabled at:
     [<ffffffff82b48326>] test_might_sleep+0xbe/0xf8
    
     BUG: sleeping function called from invalid context at kernel/test.c: 163
     in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1, name: swapper/0
     preempt_count: 1, expected: 0
     RCU nest depth: 1, expected: 0
     Preemption disabled at:
     [<ffffffff82b48326>] test_might_sleep+0x1e4/0x280
    
    This also prepares to provide a better debugging output for RT enabled
    kernels and their spinlock substitutions.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210923165358.181022656@linutronix.de
    8d713b69
core.c 273 KB