Skip to content
  • Paul E. McKenney's avatar
    rcu: Introduce lockdep-based checking to RCU read-side primitives · 632ee200
    Paul E. McKenney authored
    
    
    Inspection is proving insufficient to catch all RCU misuses,
    which is understandable given that rcu_dereference() might be
    protected by any of four different flavors of RCU (RCU, RCU-bh,
    RCU-sched, and SRCU), and might also/instead be protected by any
    of a number of locking primitives. It is therefore time to
    enlist the aid of lockdep.
    
    This set of patches is inspired by earlier work by Peter
    Zijlstra and Thomas Gleixner, and takes the following approach:
    
    o	Set up separate lockdep classes for RCU, RCU-bh, and RCU-sched.
    
    o	Set up separate lockdep classes for each instance of SRCU.
    
    o	Create primitives that check for being in an RCU read-side
    	critical section.  These return exact answers if lockdep is
    	fully enabled, but if unsure, report being in an RCU read-side
    	critical section.  (We want to avoid false positives!)
    	The primitives are:
    
    	For RCU: rcu_read_lock_held(void)
    
    	For RCU-bh: rcu_read_lock_bh_held(void)
    
    	For RCU-sched: rcu_read_lock_sched_held(void)
    
    	For SRCU: srcu_read_lock_held(struct srcu_struct *sp)
    
    o	Add rcu_dereference_check(), which takes a second argument
    	in which one places a boolean expression based on the above
    	primitives and/or lockdep_is_held().
    
    o	A new kernel configuration parameter, CONFIG_PROVE_RCU, enables
    	rcu_dereference_check().  This depends on CONFIG_PROVE_LOCKING,
    	and should be quite helpful during the transition period while
    	CONFIG_PROVE_RCU-unaware patches are in flight.
    
    The existing rcu_dereference() primitive does no checking, but
    upcoming patches will change that.
    
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: laijs@cn.fujitsu.com
    Cc: dipankar@in.ibm.com
    Cc: mathieu.desnoyers@polymtl.ca
    Cc: josh@joshtriplett.org
    Cc: dvhltc@us.ibm.com
    Cc: niv@us.ibm.com
    Cc: peterz@infradead.org
    Cc: rostedt@goodmis.org
    Cc: Valdis.Kletnieks@vt.edu
    Cc: dhowells@redhat.com
    LKML-Reference: <1266887105-1528-1-git-send-email-paulmck@linux.vnet.ibm.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    632ee200