• Thomas Gleixner's avatar
    locking/rt: Take RCU nesting into account for __might_resched() · ef1f4804
    Thomas Gleixner authored
    The general rule that rcu_read_lock() held sections cannot voluntary sleep
    does apply even on RT kernels. Though the substitution of spin/rw locks on
    RT enabled kernels has to be exempt from that rule. On !RT a spin_lock()
    can obviously nest inside a RCU read side critical section as the lock
    acquisition is not going to block, but on RT this is not longer the case
    due to the 'sleeping' spinlock substitution.
    
    The RT patches contained a cheap hack to ignore the RCU nesting depth in
    might_sleep() checks, which was a pragmatic but incorrect workaround.
    
    Instead of generally ignoring the RCU nesting depth in __might_sleep() and
    __might_resched() checks, pass the rcu_preempt_depth() via the offsets
    argument to __might_resched() from spin/read/write_lock() which makes the
    checks work correctly even in RCU read side critical sections.
    
    The actual blocking on such a substituted lock within a RCU read side
    critical section is already handled correctly in __schedule() by treating
    it as a "preemption" of the RCU read side critical section.
    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.368305497@linutronix.de
    ef1f4804
spinlock_rt.c 6.71 KB