• Paul E. McKenney's avatar
    rcu: Reject RCU_LOCKDEP_WARN() false positives · 30668200
    Paul E. McKenney authored
    
    
    If another lockdep report runs concurrently with an RCU lockdep report
    from RCU_LOCKDEP_WARN(), the following sequence of events can occur:
    
    1.	debug_lockdep_rcu_enabled() sees that lockdep is enabled
    	when called from (say) synchronize_rcu().
    
    2.	Lockdep is disabled by a concurrent lockdep report.
    
    3.	debug_lockdep_rcu_enabled() evaluates its lockdep-expression
    	argument, for example, lock_is_held(&rcu_bh_lock_map).
    
    4.	Because lockdep is now disabled, lock_is_held() plays it safe and
    	returns the constant 1.
    
    5.	But in this case, the constant 1 is not safe, because invoking
    	synchronize_rcu() under rcu_read_lock_bh() is disallowed.
    
    6.	debug_lockdep_rcu_enabled() wrongly invokes lockdep_rcu_suspicious(),
    	resulting in a false-positive splat.
    
    This commit therefore changes RCU_LOCKDEP_WARN() to check
    debug_lockdep_rcu_enabled() after checking the lockdep expression,
    so that any "safe" returns from lock_is_held() are rejected by
    debug_lockdep_rcu_enabled().  This requires memory ordering, which is
    supplied by READ_ONCE(debug_locks).  The resulting volatile accesses
    prevent the compiler from reordering and the fact that only one variable
    is being accessed prevents the underlying hardware from reordering.
    The combination works for IA64, which can reorder reads to the same
    location, but this is defeated by the volatile accesses, which compile
    to load instructions that provide ordering.
    
    Reported-by: syzbot+dde0cc33951735441301@syzkaller.appspotmail.com
    Reported-by: default avatarMatthew Wilcox <willy@infradead.org>
    Reported-by: syzbot+88e4f02896967fe1ab0d@syzkaller.appspotmail.com
    Reported-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Suggested-by: default avatarBoqun Feng <boqun.feng@gmail.com>
    Reviewed-by: default avatarBoqun Feng <boqun.feng@gmail.com>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    30668200
update.c 17.7 KB