rlock_AA5 will pass unexpectedly, marking the test as FAILED and breaking lockdep for everyone.
The following test should make lockdep complain, but currently doesn't: lock(a); readlock(x); writelock(x); lock(a); Signed-off-by: Maarten Lankhorst <maarten.lankho...@canonical.com> --- diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c index 8a1a230..d0d2540 100644 --- a/lib/locking-selftest.c +++ b/lib/locking-selftest.c @@ -301,6 +301,51 @@ static void rsem_AA3(void) RSL(X2); // this one should fail } +static void rlock_AA4(void) +{ + ML(A); + RL(X1); + RU(X1); + MU(A); + + RL(X1); + ML(A); +} + +static void rsem_AA4(void) +{ + ML(A); + RSL(X1); + RSU(X1); + MU(A); + + RSL(X1); + ML(A); +} + +static void rlock_AA5(void) +{ + ML(A); + RL(X1); + RU(X1); + MU(A); + + WL(X1); + ML(A); +} + +static void rsem_AA5(void) +{ + ML(A); + RSL(X1); + RSU(X1); + MU(A); + + WSL(X1); + ML(A); +} + + /* * ABBA deadlock: */ @@ -1661,6 +1706,21 @@ void locking_selftest(void) dotest(rsem_AA3, FAILURE, LOCKTYPE_RWSEM); printk("\n"); + print_testname("mixed normal-read-lock"); + printk(" |"); + dotest(rlock_AA4, SUCCESS, LOCKTYPE_RWLOCK); + printk(" |"); + dotest(rsem_AA4, FAILURE, LOCKTYPE_RWSEM); + printk("\n"); + + print_testname("mixed normal-r/w-lock"); + printk(" |"); + dotest(rlock_AA5, FAILURE, LOCKTYPE_RWLOCK); + printk(" |"); + dotest(rsem_AA5, FAILURE, LOCKTYPE_RWSEM); + printk("\n"); + + printk(" --------------------------------------------------------------------------\n"); /* -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/