lkml.org 
[lkml]   [2006]   [Jul]   [2]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
Patches in this message
/
DateSun, 2 Jul 2006 15:29:46 +0200
FromIngo Molnar <>
SubjectRe: 2.6.17-mm4 + hostap + pcmcia + lockdep -- possible recursive locking detected -- (af_callback_keys + sk->sk_family#3){-.-?}, at: [<c119d8db>] sock_def_readable+0x15/0x69
* Miles Lane <miles.lane@gmail.com> wrote:

> I have patches for hostap, pcmcia and lockdep applied to this kernel. 
> These patches are the ones resulting from several recent message 
> threads. I just noticed this in my kernel log:
> 
> [ INFO: possible recursive locking detected ]
> ---------------------------------------------

ok, lockdep should allow same-class read-lock recursion too, because 
it's used by real code and is being relied upon. Could you try the patch 
below? (if you have CONFIG_DEBUG_LOCKING_API_SELFTESTS enabled then 
apply the other attached patch as well, to fix two testcases.)

        Ingo

---------------->
Subject: lockdep: allow read_lock() recursion of same class
From: Ingo Molnar <mingo@elte.hu>
lockdep so far only allowed read-recursion for the same lock
instance. This is enough in the overwhelming majority of cases,
but a hostap case triggered and reported by Miles Lane relies
on same-class different-instance recursion. So we relax the
restriction on read-lock recursion.

(this change does not allow rwsem read-recursion, which is
 still forbidden.)

Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 kernel/lockdep.c |    5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
Index: linux/kernel/lockdep.c
===================================================================
--- linux.orig/kernel/lockdep.c
+++ linux/kernel/lockdep.c
@@ -843,10 +843,9 @@ check_deadlock(struct task_struct *curr,
 			continue;
 		/*
 		 * Allow read-after-read recursion of the same
-		 * lock instance (i.e. read_lock(lock)+read_lock(lock)):
+		 * lock class (i.e. read_lock(lock)+read_lock(lock)):
 		 */
-		if ((read == 2) && prev->read &&
-				(prev->instance == next_instance))
+		if ((read == 2) && prev->read)
 			return 2;
 		return print_deadlock_bug(curr, prev, next);
 	}Subject: lockdep: locking API self-tests, read-recursion update
From: Ingo Molnar <mingo@elte.hu>

lockdep now allows same type (different instance) rwlock recursion
too, update the testcases accordingly.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 lib/locking-selftest.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
Index: linux/lib/locking-selftest.c
===================================================================
--- linux.orig/lib/locking-selftest.c
+++ linux/lib/locking-selftest.c
@@ -248,7 +248,7 @@ GENERATE_TESTCASE(AA_rsem)
 
 /*
  * Special-case for read-locking, they are
- * allowed to recurse on the same lock instance:
+ * allowed to recurse on the same lock class:
  */
 static void rlock_AA1(void)
 {
@@ -259,7 +259,7 @@ static void rlock_AA1(void)
 static void rlock_AA1B(void)
 {
 	RL(X1);
-	RL(X2); // this one should fail
+	RL(X2); // this one should NOT fail
 }
 
 static void rsem_AA1(void)
@@ -1132,7 +1132,7 @@ void locking_selftest(void)
 	init_shared_classes();
 	debug_locks_silent = !debug_locks_verbose;
 
-	DO_TESTCASE_6("A-A deadlock", AA);
+	DO_TESTCASE_6R("A-A deadlock", AA);
 	DO_TESTCASE_6R("A-B-B-A deadlock", ABBA);
 	DO_TESTCASE_6R("A-B-B-C-C-A deadlock", ABBCCA);
 	DO_TESTCASE_6R("A-B-C-A-B-C deadlock", ABCABC);
@@ -1153,7 +1153,7 @@ void locking_selftest(void)
 
 	print_testname("recursive read-lock #2");
 	printk("             |");
-	dotest(rlock_AA1B, FAILURE, LOCKTYPE_RWLOCK);
+	dotest(rlock_AA1B, SUCCESS, LOCKTYPE_RWLOCK);
 	printk("             |");
 	dotest(rsem_AA1B, FAILURE, LOCKTYPE_RWSEM);
 	printk("\n");
\
 
 \ /
  Last update: 2006-07-02 15:36    [from the cache]
©2003-2008