locking: More accurate annotations for read_lock()
On the archs using QUEUED_RWLOCKS, read_lock() is not always a recursive read lock, actually it's only recursive if in_interrupt() is true. So change the annotation accordingly to catch more deadlocks. Note we used to treat read_lock() as pure recursive read locks in lib/locking-seftest.c, and this is useful, especially for the lockdep development selftest, so we keep this via a variable to force switching lock annotation for read_lock(). Signed-off-by: Boqun Feng <boqun.feng@gmail.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/20200807074238.1632519-2-boqun.feng@gmail.com
This commit is contained in:

committed by
Peter Zijlstra

parent
92b4e9f11a
commit
e918188611
@@ -28,6 +28,7 @@
|
||||
* Change this to 1 if you want to see the failure printouts:
|
||||
*/
|
||||
static unsigned int debug_locks_verbose;
|
||||
unsigned int force_read_lock_recursive;
|
||||
|
||||
static DEFINE_WD_CLASS(ww_lockdep);
|
||||
|
||||
@@ -1978,6 +1979,11 @@ void locking_selftest(void)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* treats read_lock() as recursive read locks for testing purpose
|
||||
*/
|
||||
force_read_lock_recursive = 1;
|
||||
|
||||
/*
|
||||
* Run the testsuite:
|
||||
*/
|
||||
@@ -2073,6 +2079,11 @@ void locking_selftest(void)
|
||||
|
||||
ww_tests();
|
||||
|
||||
force_read_lock_recursive = 0;
|
||||
/*
|
||||
* queued_read_lock() specific test cases can be put here
|
||||
*/
|
||||
|
||||
if (unexpected_testcase_failures) {
|
||||
printk("-----------------------------------------------------------------\n");
|
||||
debug_locks = 0;
|
||||
|
Reference in New Issue
Block a user