diff options
Diffstat (limited to 'include/linux/rcupdate.h')
-rw-r--r-- | include/linux/rcupdate.h | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 8fe86609441f..9f1ddfef84b5 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
@@ -195,12 +195,30 @@ static inline int rcu_read_lock_sched_held(void) | |||
195 | 195 | ||
196 | /** | 196 | /** |
197 | * rcu_dereference_check - rcu_dereference with debug checking | 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. | 201 | * Do an rcu_dereference(), but check that the conditions under which the |
200 | * For example, rcu_dereference_check(gp, rcu_read_lock_held()) to | 202 | * dereference will take place are correct. Typically the conditions indicate |
201 | * ensure that the rcu_dereference_check() executes within an RCU | 203 | * the various locking conditions that should be held at that point. The check |
202 | * read-side critical section. It is also possible to check for | 204 | * should return true if the conditions are satisfied. |
203 | * locks being held, for example, by using lockdep_is_held(). | 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 | #define rcu_dereference_check(p, c) \ | 223 | #define rcu_dereference_check(p, c) \ |
206 | ({ \ | 224 | ({ \ |