forked from Minki/linux
lockdep/selftest: Add a R-L/L-W test case specific to chain cache behavior
As our chain cache doesn't differ read/write locks, so even we can detect a read-lock/lock-write deadlock in check_noncircular(), we can still be fooled if a read-lock/lock-read case(which is not a deadlock) comes first. So introduce this test case to test specific to the chain cache behavior on detecting recursive read lock related deadlocks. 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-14-boqun.feng@gmail.com
This commit is contained in:
parent
621c9dac0e
commit
d4f200e579
@ -396,6 +396,49 @@ static void rwsem_ABBA1(void)
|
||||
MU(Y1); // should fail
|
||||
}
|
||||
|
||||
/*
|
||||
* read_lock(A)
|
||||
* spin_lock(B)
|
||||
* spin_lock(B)
|
||||
* write_lock(A)
|
||||
*
|
||||
* This test case is aimed at poking whether the chain cache prevents us from
|
||||
* detecting a read-lock/lock-write deadlock: if the chain cache doesn't differ
|
||||
* read/write locks, the following case may happen
|
||||
*
|
||||
* { read_lock(A)->lock(B) dependency exists }
|
||||
*
|
||||
* P0:
|
||||
* lock(B);
|
||||
* read_lock(A);
|
||||
*
|
||||
* { Not a deadlock, B -> A is added in the chain cache }
|
||||
*
|
||||
* P1:
|
||||
* lock(B);
|
||||
* write_lock(A);
|
||||
*
|
||||
* { B->A found in chain cache, not reported as a deadlock }
|
||||
*
|
||||
*/
|
||||
static void rlock_chaincache_ABBA1(void)
|
||||
{
|
||||
RL(X1);
|
||||
L(Y1);
|
||||
U(Y1);
|
||||
RU(X1);
|
||||
|
||||
L(Y1);
|
||||
RL(X1);
|
||||
RU(X1);
|
||||
U(Y1);
|
||||
|
||||
L(Y1);
|
||||
WL(X1);
|
||||
WU(X1);
|
||||
U(Y1); // should fail
|
||||
}
|
||||
|
||||
/*
|
||||
* read_lock(A)
|
||||
* spin_lock(B)
|
||||
@ -2062,6 +2105,10 @@ void locking_selftest(void)
|
||||
pr_cont(" |");
|
||||
dotest(rwsem_ABBA3, FAILURE, LOCKTYPE_RWSEM);
|
||||
|
||||
print_testname("chain cached mixed R-L/L-W ABBA");
|
||||
pr_cont(" |");
|
||||
dotest(rlock_chaincache_ABBA1, FAILURE, LOCKTYPE_RWLOCK);
|
||||
|
||||
printk(" --------------------------------------------------------------------------\n");
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user