|
@@ -192,6 +192,15 @@ static inline int rcu_read_lock_sched_held(void)
|
|
|
|
|
|
extern int rcu_my_thread_group_empty(void);
|
|
|
|
|
|
+#define __do_rcu_dereference_check(c) \
|
|
|
+ do { \
|
|
|
+ static bool __warned; \
|
|
|
+ if (debug_lockdep_rcu_enabled() && !__warned && !(c)) { \
|
|
|
+ __warned = true; \
|
|
|
+ lockdep_rcu_dereference(__FILE__, __LINE__); \
|
|
|
+ } \
|
|
|
+ } while (0)
|
|
|
+
|
|
|
/**
|
|
|
* rcu_dereference_check - rcu_dereference with debug checking
|
|
|
* @p: The pointer to read, prior to dereferencing
|
|
@@ -221,8 +230,7 @@ extern int rcu_my_thread_group_empty(void);
|
|
|
*/
|
|
|
#define rcu_dereference_check(p, c) \
|
|
|
({ \
|
|
|
- if (debug_lockdep_rcu_enabled() && !(c)) \
|
|
|
- lockdep_rcu_dereference(__FILE__, __LINE__); \
|
|
|
+ __do_rcu_dereference_check(c); \
|
|
|
rcu_dereference_raw(p); \
|
|
|
})
|
|
|
|
|
@@ -239,8 +247,7 @@ extern int rcu_my_thread_group_empty(void);
|
|
|
*/
|
|
|
#define rcu_dereference_protected(p, c) \
|
|
|
({ \
|
|
|
- if (debug_lockdep_rcu_enabled() && !(c)) \
|
|
|
- lockdep_rcu_dereference(__FILE__, __LINE__); \
|
|
|
+ __do_rcu_dereference_check(c); \
|
|
|
(p); \
|
|
|
})
|
|
|
|