lkml.org 
[lkml]   [2018]   [Feb]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC tip/locking/lockdep v5 10/17] lockdep/selftest: Add a R-L/L-W test case specific to chain cache behavior
    Date
    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>
    ---
    lib/locking-selftest.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 47 insertions(+)

    diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c
    index b5c1293ce147..700f9aa19db6 100644
    --- a/lib/locking-selftest.c
    +++ b/lib/locking-selftest.c
    @@ -395,6 +395,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)
    @@ -2055,6 +2098,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");

    /*
    --
    2.16.1
    \
     
     \ /
      Last update: 2018-02-22 08:08    [W:3.025 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site