[PATCH tip/core/urgent 3/5] rcu: leave lockdep enabled after RCU lockdep splat

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Paul E. McKenney
Date: Wednesday, April 21, 2010 - 1:02 pm

From: Lai Jiangshan <laijs@cn.fujitsu.com>

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.

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>
---
 include/linux/rcupdate.h |   15 +++++++++++----
 kernel/lockdep.c         |    2 --
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
index 07db2fe..ec9ab49 100644
--- a/include/linux/rcupdate.h
+++ b/include/linux/rcupdate.h
@@ -190,6 +190,15 @@ static inline int rcu_read_lock_sched_held(void)
 
 #ifdef CONFIG_PROVE_RCU
 
+#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
@@ -219,8 +228,7 @@ static inline int rcu_read_lock_sched_held(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); \
 	})
 
@@ -237,8 +245,7 @@ static inline int rcu_read_lock_sched_held(void)
  */
 #define rcu_dereference_protected(p, c) \
 	({ \
-		if (debug_lockdep_rcu_enabled() && !(c)) \
-			lockdep_rcu_dereference(__FILE__, __LINE__); \
+		__do_rcu_dereference_check(c); \
 		(p); \
 	})
 
diff --git a/kernel/lockdep.c b/kernel/lockdep.c
index 2594e1c..03dd1fa 100644
--- a/kernel/lockdep.c
+++ b/kernel/lockdep.c
@@ -3801,8 +3801,6 @@ void lockdep_rcu_dereference(const char *file, const int line)
 {
 	struct task_struct *curr = current;
 
-	if (!debug_locks_off())
-		return;
 	printk("\n===================================================\n");
 	printk(  "[ INFO: suspicious rcu_dereference_check() usage. ]\n");
 	printk(  "---------------------------------------------------\n");
-- 
1.7.0

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH tip/core/urgent] fix several lockdep splats, allow ..., Paul E. McKenney, (Wed Apr 21, 1:01 pm)
[PATCH tip/core/urgent 1/5] rcu: Fix RCU lockdep splat in ..., Paul E. McKenney, (Wed Apr 21, 1:02 pm)
[PATCH tip/core/urgent 2/5] rcu: fix RCU lockdep splat on ..., Paul E. McKenney, (Wed Apr 21, 1:02 pm)
[PATCH tip/core/urgent 3/5] rcu: leave lockdep enabled aft ..., Paul E. McKenney, (Wed Apr 21, 1:02 pm)
[tip:core/urgent] rcu: Fix RCU lockdep splat in set_task_c ..., tip-bot for Peter Zi ..., (Fri Apr 30, 3:51 am)
[tip:core/urgent] rcu: Fix RCU lockdep splat on freezer_fo ..., tip-bot for Paul E. ..., (Fri Apr 30, 3:51 am)
Re: [PATCH tip/core/urgent] fix several lockdep splats, al ..., Mathieu Desnoyers, (Fri Apr 30, 8:33 am)
Re: [PATCH tip/core/urgent] fix several lockdep splats, al ..., Paul E. McKenney, (Fri Apr 30, 11:02 am)
Re: [PATCH tip/core/urgent] fix several lockdep splats, al ..., Mathieu Desnoyers, (Fri Apr 30, 11:12 am)
Re: [PATCH tip/core/urgent] fix several lockdep splats, al ..., Paul E. McKenney, (Fri Apr 30, 11:32 am)
Re: [PATCH tip/core/urgent] fix several lockdep splats, al ..., Mathieu Desnoyers, (Fri Apr 30, 12:09 pm)