rcu: Better explain the condition parameter of rcu_dereference_check()

Better explain the condition parameter of
rcu_dereference_check() that describes the conditions under
which the dereference is permitted to take place (and
incorporate Yong Zhang's suggestion). This condition is only
checked under lockdep proving.

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Paul 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: eric.dumazet@gmail.com
LKML-Reference: <1270852752-25278-2-git-send-email-paulmck@linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

authored by David Howells and committed by Ingo Molnar c08c68dd b62730ba

+23 -5
+23 -5
include/linux/rcupdate.h
··· 195 195 196 196 /** 197 197 * rcu_dereference_check - rcu_dereference with debug checking 198 + * @p: The pointer to read, prior to dereferencing 199 + * @c: The conditions under which the dereference will take place 198 200 * 199 - * Do an rcu_dereference(), but check that the context is correct. 200 - * For example, rcu_dereference_check(gp, rcu_read_lock_held()) to 201 - * ensure that the rcu_dereference_check() executes within an RCU 202 - * read-side critical section. It is also possible to check for 203 - * locks being held, for example, by using lockdep_is_held(). 201 + * Do an rcu_dereference(), but check that the conditions under which the 202 + * dereference will take place are correct. Typically the conditions indicate 203 + * the various locking conditions that should be held at that point. The check 204 + * should return true if the conditions are satisfied. 205 + * 206 + * For example: 207 + * 208 + * bar = rcu_dereference_check(foo->bar, rcu_read_lock_held() || 209 + * lockdep_is_held(&foo->lock)); 210 + * 211 + * could be used to indicate to lockdep that foo->bar may only be dereferenced 212 + * if either the RCU read lock is held, or that the lock required to replace 213 + * the bar struct at foo->bar is held. 214 + * 215 + * Note that the list of conditions may also include indications of when a lock 216 + * need not be held, for example during initialisation or destruction of the 217 + * target struct: 218 + * 219 + * bar = rcu_dereference_check(foo->bar, rcu_read_lock_held() || 220 + * lockdep_is_held(&foo->lock) || 221 + * atomic_read(&foo->usage) == 0); 204 222 */ 205 223 #define rcu_dereference_check(p, c) \ 206 224 ({ \