diff options
| -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 | ({ \ |
