[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
parent
fbb9ce9530
commit
6c9076ec9c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue