diff options
Diffstat (limited to 'include/linux/rcupdate.h')
-rw-r--r-- | include/linux/rcupdate.h | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index b973dea2d6b0..b124bc6a75ad 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
@@ -215,7 +215,11 @@ static inline int rcu_read_lock_sched_held(void) | |||
215 | 215 | ||
216 | extern int rcu_my_thread_group_empty(void); | 216 | extern int rcu_my_thread_group_empty(void); |
217 | 217 | ||
218 | #define __do_rcu_dereference_check(c) \ | 218 | /** |
219 | * rcu_lockdep_assert - emit lockdep splat if specified condition not met | ||
220 | * @c: condition to check | ||
221 | */ | ||
222 | #define rcu_lockdep_assert(c) \ | ||
219 | do { \ | 223 | do { \ |
220 | static bool __warned; \ | 224 | static bool __warned; \ |
221 | if (debug_lockdep_rcu_enabled() && !__warned && !(c)) { \ | 225 | if (debug_lockdep_rcu_enabled() && !__warned && !(c)) { \ |
@@ -226,7 +230,7 @@ extern int rcu_my_thread_group_empty(void); | |||
226 | 230 | ||
227 | #else /* #ifdef CONFIG_PROVE_RCU */ | 231 | #else /* #ifdef CONFIG_PROVE_RCU */ |
228 | 232 | ||
229 | #define __do_rcu_dereference_check(c) do { } while (0) | 233 | #define rcu_lockdep_assert(c) do { } while (0) |
230 | 234 | ||
231 | #endif /* #else #ifdef CONFIG_PROVE_RCU */ | 235 | #endif /* #else #ifdef CONFIG_PROVE_RCU */ |
232 | 236 | ||
@@ -247,14 +251,14 @@ extern int rcu_my_thread_group_empty(void); | |||
247 | #define __rcu_dereference_check(p, c, space) \ | 251 | #define __rcu_dereference_check(p, c, space) \ |
248 | ({ \ | 252 | ({ \ |
249 | typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \ | 253 | typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \ |
250 | __do_rcu_dereference_check(c); \ | 254 | rcu_lockdep_assert(c); \ |
251 | (void) (((typeof (*p) space *)p) == p); \ | 255 | (void) (((typeof (*p) space *)p) == p); \ |
252 | smp_read_barrier_depends(); \ | 256 | smp_read_barrier_depends(); \ |
253 | ((typeof(*p) __force __kernel *)(_________p1)); \ | 257 | ((typeof(*p) __force __kernel *)(_________p1)); \ |
254 | }) | 258 | }) |
255 | #define __rcu_dereference_protected(p, c, space) \ | 259 | #define __rcu_dereference_protected(p, c, space) \ |
256 | ({ \ | 260 | ({ \ |
257 | __do_rcu_dereference_check(c); \ | 261 | rcu_lockdep_assert(c); \ |
258 | (void) (((typeof (*p) space *)p) == p); \ | 262 | (void) (((typeof (*p) space *)p) == p); \ |
259 | ((typeof(*p) __force __kernel *)(p)); \ | 263 | ((typeof(*p) __force __kernel *)(p)); \ |
260 | }) | 264 | }) |
@@ -262,7 +266,7 @@ extern int rcu_my_thread_group_empty(void); | |||
262 | #define __rcu_dereference_index_check(p, c) \ | 266 | #define __rcu_dereference_index_check(p, c) \ |
263 | ({ \ | 267 | ({ \ |
264 | typeof(p) _________p1 = ACCESS_ONCE(p); \ | 268 | typeof(p) _________p1 = ACCESS_ONCE(p); \ |
265 | __do_rcu_dereference_check(c); \ | 269 | rcu_lockdep_assert(c); \ |
266 | smp_read_barrier_depends(); \ | 270 | smp_read_barrier_depends(); \ |
267 | (_________p1); \ | 271 | (_________p1); \ |
268 | }) | 272 | }) |