1
0
Fork 0

[PATCH] 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>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
hifive-unleashed-5.1
Ingo Molnar 2006-07-03 00:24:51 -07:00 committed by Linus Torvalds
parent fbb9ce9530
commit 6c9076ec9c
2 changed files with 6 additions and 7 deletions

View File

@ -843,10 +843,9 @@ check_deadlock(struct task_struct *curr, struct held_lock *next,
continue; continue;
/* /*
* Allow read-after-read recursion of the same * 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 && if ((read == 2) && prev->read)
(prev->instance == next_instance))
return 2; return 2;
return print_deadlock_bug(curr, prev, next); return print_deadlock_bug(curr, prev, next);
} }

View File

@ -248,7 +248,7 @@ GENERATE_TESTCASE(AA_rsem)
/* /*
* Special-case for read-locking, they are * 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) static void rlock_AA1(void)
{ {
@ -259,7 +259,7 @@ static void rlock_AA1(void)
static void rlock_AA1B(void) static void rlock_AA1B(void)
{ {
RL(X1); RL(X1);
RL(X2); // this one should fail RL(X2); // this one should NOT fail
} }
static void rsem_AA1(void) static void rsem_AA1(void)
@ -1132,7 +1132,7 @@ void locking_selftest(void)
init_shared_classes(); init_shared_classes();
debug_locks_silent = !debug_locks_verbose; 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-A deadlock", ABBA);
DO_TESTCASE_6R("A-B-B-C-C-A deadlock", ABBCCA); DO_TESTCASE_6R("A-B-B-C-C-A deadlock", ABBCCA);
DO_TESTCASE_6R("A-B-C-A-B-C deadlock", ABCABC); 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"); print_testname("recursive read-lock #2");
printk(" |"); printk(" |");
dotest(rlock_AA1B, FAILURE, LOCKTYPE_RWLOCK); dotest(rlock_AA1B, SUCCESS, LOCKTYPE_RWLOCK);
printk(" |"); printk(" |");
dotest(rsem_AA1B, FAILURE, LOCKTYPE_RWSEM); dotest(rsem_AA1B, FAILURE, LOCKTYPE_RWSEM);
printk("\n"); printk("\n");