aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2006-07-03 03:24:51 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-07-03 18:27:04 -0400
commit6c9076ec9cd448f43bbda871352a7067f456ee26 (patch)
tree8691366aa511f20146eb9cfe942e0d94c4136e1a
parentfbb9ce9530fd9b66096d5187fa6a115d16d9746c (diff)
[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>
-rw-r--r--kernel/lockdep.c5
-rw-r--r--lib/locking-selftest.c8
2 files changed, 6 insertions, 7 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c
index dd0580910a97..f32ca78c198d 100644
--- a/kernel/lockdep.c
+++ b/kernel/lockdep.c
@@ -843,10 +843,9 @@ check_deadlock(struct task_struct *curr, struct held_lock *next,
843 continue; 843 continue;
844 /* 844 /*
845 * Allow read-after-read recursion of the same 845 * Allow read-after-read recursion of the same
846 * lock instance (i.e. read_lock(lock)+read_lock(lock)): 846 * lock class (i.e. read_lock(lock)+read_lock(lock)):
847 */ 847 */
848 if ((read == 2) && prev->read && 848 if ((read == 2) && prev->read)
849 (prev->instance == next_instance))
850 return 2; 849 return 2;
851 return print_deadlock_bug(curr, prev, next); 850 return print_deadlock_bug(curr, prev, next);
852 } 851 }
diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c
index 9bdc8d440b2b..7945787f439a 100644
--- a/lib/locking-selftest.c
+++ b/lib/locking-selftest.c
@@ -248,7 +248,7 @@ GENERATE_TESTCASE(AA_rsem)
248 248
249/* 249/*
250 * Special-case for read-locking, they are 250 * Special-case for read-locking, they are
251 * allowed to recurse on the same lock instance: 251 * allowed to recurse on the same lock class:
252 */ 252 */
253static void rlock_AA1(void) 253static void rlock_AA1(void)
254{ 254{
@@ -259,7 +259,7 @@ static void rlock_AA1(void)
259static void rlock_AA1B(void) 259static void rlock_AA1B(void)
260{ 260{
261 RL(X1); 261 RL(X1);
262 RL(X2); // this one should fail 262 RL(X2); // this one should NOT fail
263} 263}
264 264
265static void rsem_AA1(void) 265static void rsem_AA1(void)
@@ -1132,7 +1132,7 @@ void locking_selftest(void)
1132 init_shared_classes(); 1132 init_shared_classes();
1133 debug_locks_silent = !debug_locks_verbose; 1133 debug_locks_silent = !debug_locks_verbose;
1134 1134
1135 DO_TESTCASE_6("A-A deadlock", AA); 1135 DO_TESTCASE_6R("A-A deadlock", AA);
1136 DO_TESTCASE_6R("A-B-B-A deadlock", ABBA); 1136 DO_TESTCASE_6R("A-B-B-A deadlock", ABBA);
1137 DO_TESTCASE_6R("A-B-B-C-C-A deadlock", ABBCCA); 1137 DO_TESTCASE_6R("A-B-B-C-C-A deadlock", ABBCCA);
1138 DO_TESTCASE_6R("A-B-C-A-B-C deadlock", ABCABC); 1138 DO_TESTCASE_6R("A-B-C-A-B-C deadlock", ABCABC);
@@ -1153,7 +1153,7 @@ void locking_selftest(void)
1153 1153
1154 print_testname("recursive read-lock #2"); 1154 print_testname("recursive read-lock #2");
1155 printk(" |"); 1155 printk(" |");
1156 dotest(rlock_AA1B, FAILURE, LOCKTYPE_RWLOCK); 1156 dotest(rlock_AA1B, SUCCESS, LOCKTYPE_RWLOCK);
1157 printk(" |"); 1157 printk(" |");
1158 dotest(rsem_AA1B, FAILURE, LOCKTYPE_RWSEM); 1158 dotest(rsem_AA1B, FAILURE, LOCKTYPE_RWSEM);
1159 printk("\n"); 1159 printk("\n");