diff options
author | Lai Jiangshan <laijs@cn.fujitsu.com> | 2010-04-20 04:23:07 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-05-10 14:08:31 -0400 |
commit | 2b3fc35f6919344e3cf722dde8308f47235c0b70 (patch) | |
tree | 2bc2cfc9c1a032d51a3d99a10e309e100b9eea4a /kernel/lockdep.c | |
parent | b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (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 'kernel/lockdep.c')
-rw-r--r-- | kernel/lockdep.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 2594e1ce41cb..3a756ba8d5d8 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
@@ -3801,8 +3801,11 @@ void lockdep_rcu_dereference(const char *file, const int line) | |||
3801 | { | 3801 | { |
3802 | struct task_struct *curr = current; | 3802 | struct task_struct *curr = current; |
3803 | 3803 | ||
3804 | #ifndef CONFIG_PROVE_RCU_REPEATEDLY | ||
3804 | if (!debug_locks_off()) | 3805 | if (!debug_locks_off()) |
3805 | return; | 3806 | return; |
3807 | #endif /* #ifdef CONFIG_PROVE_RCU_REPEATEDLY */ | ||
3808 | /* Note: the following can be executed concurrently, so be careful. */ | ||
3806 | printk("\n===================================================\n"); | 3809 | printk("\n===================================================\n"); |
3807 | printk( "[ INFO: suspicious rcu_dereference_check() usage. ]\n"); | 3810 | printk( "[ INFO: suspicious rcu_dereference_check() usage. ]\n"); |
3808 | printk( "---------------------------------------------------\n"); | 3811 | printk( "---------------------------------------------------\n"); |