From: Ingo Molnar From: Ingo Molnar 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 Signed-off-by: Andrew Morton --- kernel/lockdep.c | 5 ++--- lib/locking-selftest.c | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff -puN kernel/lockdep.c~lockdep-allow-read_lock-recursion-of-same-class kernel/lockdep.c --- a/kernel/lockdep.c~lockdep-allow-read_lock-recursion-of-same-class +++ a/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); } diff -puN lib/locking-selftest.c~lockdep-allow-read_lock-recursion-of-same-class lib/locking-selftest.c --- a/lib/locking-selftest.c~lockdep-allow-read_lock-recursion-of-same-class +++ a/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"); _