[PATCH] lockdep: allow read_lock() recursion of same class
authorIngo Molnar <mingo@elte.hu>
Mon, 3 Jul 2006 07:24:51 +0000 (00:24 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 3 Jul 2006 22:27:04 +0000 (15:27 -0700)
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>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
kernel/lockdep.c
lib/locking-selftest.c

index dd05809..f32ca78 100644 (file)
@@ -843,10 +843,9 @@ check_deadlock(struct task_struct *curr, struct held_lock *next,
                        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);
        }
index 9bdc8d4..7945787 100644 (file)
@@ -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");