diff options
Diffstat (limited to 'include/linux/srcu.h')
| -rw-r--r-- | include/linux/srcu.h | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/include/linux/srcu.h b/include/linux/srcu.h index 4d5d2f546dbf..58971e891f48 100644 --- a/include/linux/srcu.h +++ b/include/linux/srcu.h | |||
| @@ -108,19 +108,43 @@ static inline int srcu_read_lock_held(struct srcu_struct *sp) | |||
| 108 | #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | 108 | #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ |
| 109 | 109 | ||
| 110 | /** | 110 | /** |
| 111 | * srcu_dereference - fetch SRCU-protected pointer with checking | 111 | * srcu_dereference_check - fetch SRCU-protected pointer for later dereferencing |
| 112 | * @p: the pointer to fetch and protect for later dereferencing | ||
| 113 | * @sp: pointer to the srcu_struct, which is used to check that we | ||
| 114 | * really are in an SRCU read-side critical section. | ||
| 115 | * @c: condition to check for update-side use | ||
| 112 | * | 116 | * |
| 113 | * Makes rcu_dereference_check() do the dirty work. | 117 | * If PROVE_RCU is enabled, invoking this outside of an RCU read-side |
| 118 | * critical section will result in an RCU-lockdep splat, unless @c evaluates | ||
| 119 | * to 1. The @c argument will normally be a logical expression containing | ||
| 120 | * lockdep_is_held() calls. | ||
| 114 | */ | 121 | */ |
| 115 | #define srcu_dereference(p, sp) \ | 122 | #define srcu_dereference_check(p, sp, c) \ |
| 116 | rcu_dereference_check(p, srcu_read_lock_held(sp)) | 123 | __rcu_dereference_check((p), srcu_read_lock_held(sp) || (c), __rcu) |
| 124 | |||
| 125 | /** | ||
| 126 | * srcu_dereference - fetch SRCU-protected pointer for later dereferencing | ||
| 127 | * @p: the pointer to fetch and protect for later dereferencing | ||
| 128 | * @sp: pointer to the srcu_struct, which is used to check that we | ||
| 129 | * really are in an SRCU read-side critical section. | ||
| 130 | * | ||
| 131 | * Makes rcu_dereference_check() do the dirty work. If PROVE_RCU | ||
| 132 | * is enabled, invoking this outside of an RCU read-side critical | ||
| 133 | * section will result in an RCU-lockdep splat. | ||
| 134 | */ | ||
| 135 | #define srcu_dereference(p, sp) srcu_dereference_check((p), (sp), 0) | ||
| 117 | 136 | ||
| 118 | /** | 137 | /** |
| 119 | * srcu_read_lock - register a new reader for an SRCU-protected structure. | 138 | * srcu_read_lock - register a new reader for an SRCU-protected structure. |
| 120 | * @sp: srcu_struct in which to register the new reader. | 139 | * @sp: srcu_struct in which to register the new reader. |
| 121 | * | 140 | * |
| 122 | * Enter an SRCU read-side critical section. Note that SRCU read-side | 141 | * Enter an SRCU read-side critical section. Note that SRCU read-side |
| 123 | * critical sections may be nested. | 142 | * critical sections may be nested. However, it is illegal to |
| 143 | * call anything that waits on an SRCU grace period for the same | ||
| 144 | * srcu_struct, whether directly or indirectly. Please note that | ||
| 145 | * one way to indirectly wait on an SRCU grace period is to acquire | ||
| 146 | * a mutex that is held elsewhere while calling synchronize_srcu() or | ||
| 147 | * synchronize_srcu_expedited(). | ||
| 124 | */ | 148 | */ |
| 125 | static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp) | 149 | static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp) |
| 126 | { | 150 | { |
