aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/rcupdate.h
diff options
context:
space:
mode:
authorLai Jiangshan <laijs@cn.fujitsu.com>2010-04-20 04:23:07 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2010-05-10 14:08:31 -0400
commit2b3fc35f6919344e3cf722dde8308f47235c0b70 (patch)
tree2bc2cfc9c1a032d51a3d99a10e309e100b9eea4a /include/linux/rcupdate.h
parentb57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (diff)
rcu: optionally leave lockdep enabled after RCU lockdep splat
There is no need to disable lockdep after an RCU lockdep splat, so remove the debug_lockdeps_off() from lockdep_rcu_dereference(). To avoid repeated lockdep splats, use a static variable in the inlined rcu_dereference_check() and rcu_dereference_protected() macros so that a given instance splats only once, but so that multiple instances can be detected per boot. This is controlled by a new config variable CONFIG_PROVE_RCU_REPEATEDLY, which is disabled by default. This provides the normal lockdep behavior by default, but permits people who want to find multiple RCU-lockdep splats per boot to easily do so. Requested-by: Eric Paris <eparis@redhat.com> Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> Tested-by: Eric Paris <eparis@redhat.com> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'include/linux/rcupdate.h')
-rw-r--r--include/linux/rcupdate.h15
1 files changed, 11 insertions, 4 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
index db266bbed23f..4dca2752cfde 100644
--- a/include/linux/rcupdate.h
+++ b/include/linux/rcupdate.h
@@ -192,6 +192,15 @@ static inline int rcu_read_lock_sched_held(void)
192 192
193extern int rcu_my_thread_group_empty(void); 193extern int rcu_my_thread_group_empty(void);
194 194
195#define __do_rcu_dereference_check(c) \
196 do { \
197 static bool __warned; \
198 if (debug_lockdep_rcu_enabled() && !__warned && !(c)) { \
199 __warned = true; \
200 lockdep_rcu_dereference(__FILE__, __LINE__); \
201 } \
202 } while (0)
203
195/** 204/**
196 * rcu_dereference_check - rcu_dereference with debug checking 205 * rcu_dereference_check - rcu_dereference with debug checking
197 * @p: The pointer to read, prior to dereferencing 206 * @p: The pointer to read, prior to dereferencing
@@ -221,8 +230,7 @@ extern int rcu_my_thread_group_empty(void);
221 */ 230 */
222#define rcu_dereference_check(p, c) \ 231#define rcu_dereference_check(p, c) \
223 ({ \ 232 ({ \
224 if (debug_lockdep_rcu_enabled() && !(c)) \ 233 __do_rcu_dereference_check(c); \
225 lockdep_rcu_dereference(__FILE__, __LINE__); \
226 rcu_dereference_raw(p); \ 234 rcu_dereference_raw(p); \
227 }) 235 })
228 236
@@ -239,8 +247,7 @@ extern int rcu_my_thread_group_empty(void);
239 */ 247 */
240#define rcu_dereference_protected(p, c) \ 248#define rcu_dereference_protected(p, c) \
241 ({ \ 249 ({ \
242 if (debug_lockdep_rcu_enabled() && !(c)) \ 250 __do_rcu_dereference_check(c); \
243 lockdep_rcu_dereference(__FILE__, __LINE__); \
244 (p); \ 251 (p); \
245 }) 252 })
246 253