Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1739298
| Path | csiph.com!weretis.net!feeder4.news.weretis.net!news.mixmin.net!aioe.org!bofh.it!news.nic.it!robomod |
|---|---|
| From | Boqun Feng <boqun.feng@gmail.com> |
| Newsgroups | linux.kernel |
| Subject | [RFC tip/locking/lockdep v3 13/14] lockdep/selftest: Add more recursive read related test cases |
| Date | Tue, 26 Sep 2017 00:20:01 +0200 |
| Message-ID | <utJTj-47L-5@gated-at.bofh.it> (permalink) |
| References | <utJTj-47L-3@gated-at.bofh.it> |
| X-Original-To | linux-kernel@vger.kernel.org |
| Dkim-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2anZ5bPLE74E+kSnkH2H6/GQSub/JbqwyHDUsKll4kY=; b=KhYms+AmksunXjqfRXziXWA4DBGWLPxSVSZT/7nPythXtgAv+kaffdxcb+EIzATnsr 4Aud5vVqHFOJOJiJBX+lj+5uOYWL3nLfM1/Za5wbZ1a6a06duEKSt320ok1fp44xWjpY 4wOVJGJU8RrFnThk9gwmbRb9MFZ0WDfxqc5zw8dlUetMCkYJdfSrjV/QYrARaPiumatX 2CPForGotm7+ndiiDvjwiWQyta3Fi04cJjWhmQZ1QNpC08OzANJ1+OAUiDiL8Mr6a4SD /iAh1Qn5bRzyb+dAD6r/kFhQ9z/SMYoaWa+ohyWpvqOGOAr3QuCjw5qHK8xqn0aZPMxE cjsQ== |
| X-Google-Dkim-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2anZ5bPLE74E+kSnkH2H6/GQSub/JbqwyHDUsKll4kY=; b=t2L4l2taPAH0H6AJrmS8t51HhQAQjX5CT84VuDzeQYhCNEi08x3U7sMMdqsVfoYdvL Z12NDxqRwyTfB0C/y3pk0gW6R9S5DPchzydMsLPsHpdb5Ytgb3HQe3I3RpI6ArF8hXJm JqRoC/fj6MpygogK7V8otkgDvnnZW3sAjgEy+hnlcAdaAtV7sN/5mHz6q7mTtfaoRJl+ K95ol0/USLpNn6lhaAKa+6ahHRsr0gI8IyRqgU7xvuN9WHIAWY9g3cawazeNllS2/Iox l45/9jZKzIrrOP6+v8ATLTVjSoAt9DFIIJfYaebUob10D4zRzqLijz9b+AdxDiyW9wjt jpmw== |
| X-Gm-Message-State | AHPjjUjqLn+9apHReTtEowTUlUF1CYPoQan9pRkQOh4AIHSiaYM75xcg 7GE9d9dwaa1tP++n8wMqS/L20oIq |
| X-Google-SMTP-Source | AOwi7QCkorhUHiKCyBkXFLqqyaw0ggMD82WAriUSIYbv6L7ajBw5WY5C1j/dousoDHiZEpY3v30+Bw== |
| X-Received | by 10.99.3.15 with SMTP id 15mr8972772pgd.403.1506377981904; Mon, 25 Sep 2017 15:19:41 -0700 (PDT) |
| X-Mailer | git-send-email 2.14.1 |
| Sender | robomod@news.nic.it |
| List-ID | <linux-kernel.vger.kernel.org> |
| X-Mailing-List | linux-kernel@vger.kernel.org |
| Approved | robomod@news.nic.it |
| Lines | 213 |
| Organization | linux.* mail to news gateway |
| X-Original-Cc | Ingo Molnar <mingo@kernel.org>, Peter Zijlstra <peterz@infradead.org>, Gautham R Shenoy <ego@linux.vnet.ibm.com>, Byungchul Park <byungchul.park@lge.com>, Boqun Feng <boqun.feng@gmail.com> |
| X-Original-Date | Tue, 26 Sep 2017 06:18:47 +0800 |
| X-Original-Message-ID | <20170925221848.6646-14-boqun.feng@gmail.com> |
| X-Original-References | <20170925221848.6646-1-boqun.feng@gmail.com> |
| X-Original-Sender | linux-kernel-owner@vger.kernel.org |
| Xref | csiph.com linux.kernel:1739298 |
Show key headers only | View raw
Add those four test cases:
1. X --(NR)--> Y --(NR)--> Z --(NR)--> X is deadlock.
2. X --(NN)--> Y --(RR)--> Z --(NR)--> X is deadlock.
3. X --(NN)--> Y --(RR)--> Z --(RN)--> X is not deadlock.
4. X --(NR)--> Y --(RR)--> Z --(NN)--> X is not deadlock.
Those self testcases are valuable for the development of supporting
recursive read related deadlock detection.
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
lib/locking-selftest.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 161 insertions(+)
diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c
index cbdcec6a776e..0fe16f06ed00 100644
--- a/lib/locking-selftest.c
+++ b/lib/locking-selftest.c
@@ -1032,6 +1032,133 @@ GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_wlock)
#undef E2
#undef E3
+/*
+ * write-read / write-read / write-read deadlock even if read is recursive
+ */
+
+#define E1() \
+ \
+ WL(X1); \
+ RL(Y1); \
+ RU(Y1); \
+ WU(X1);
+
+#define E2() \
+ \
+ WL(Y1); \
+ RL(Z1); \
+ RU(Z1); \
+ WU(Y1);
+
+#define E3() \
+ \
+ WL(Z1); \
+ RL(X1); \
+ RU(X1); \
+ WU(Z1);
+
+#include "locking-selftest-rlock.h"
+GENERATE_PERMUTATIONS_3_EVENTS(W1R2_W2R3_W3R1)
+
+#undef E1
+#undef E2
+#undef E3
+
+/*
+ * write-write / read-read / write-read deadlock even if read is recursive
+ */
+
+#define E1() \
+ \
+ WL(X1); \
+ WL(Y1); \
+ WU(Y1); \
+ WU(X1);
+
+#define E2() \
+ \
+ RL(Y1); \
+ RL(Z1); \
+ RU(Z1); \
+ RU(Y1);
+
+#define E3() \
+ \
+ WL(Z1); \
+ RL(X1); \
+ RU(X1); \
+ WU(Z1);
+
+#include "locking-selftest-rlock.h"
+GENERATE_PERMUTATIONS_3_EVENTS(W1W2_R2R3_W3R1)
+
+#undef E1
+#undef E2
+#undef E3
+
+/*
+ * write-write / read-read / read-write is not deadlock when read is recursive
+ */
+
+#define E1() \
+ \
+ WL(X1); \
+ WL(Y1); \
+ WU(Y1); \
+ WU(X1);
+
+#define E2() \
+ \
+ RL(Y1); \
+ RL(Z1); \
+ RU(Z1); \
+ RU(Y1);
+
+#define E3() \
+ \
+ RL(Z1); \
+ WL(X1); \
+ WU(X1); \
+ RU(Z1);
+
+#include "locking-selftest-rlock.h"
+GENERATE_PERMUTATIONS_3_EVENTS(W1R2_R2R3_W3W1)
+
+#undef E1
+#undef E2
+#undef E3
+
+/*
+ * write-read / read-read / write-write is not deadlock when read is recursive
+ */
+
+#define E1() \
+ \
+ WL(X1); \
+ RL(Y1); \
+ RU(Y1); \
+ WU(X1);
+
+#define E2() \
+ \
+ RL(Y1); \
+ RL(Z1); \
+ RU(Z1); \
+ RU(Y1);
+
+#define E3() \
+ \
+ WL(Z1); \
+ WL(X1); \
+ WU(X1); \
+ WU(Z1);
+
+#include "locking-selftest-rlock.h"
+GENERATE_PERMUTATIONS_3_EVENTS(W1W2_R2R3_R3W1)
+
+#undef E1
+#undef E2
+#undef E3
/*
* read-lock / write-lock recursion that is actually safe.
*/
@@ -1257,6 +1384,19 @@ static inline void print_testname(const char *testname)
dotest(name##_##nr, FAILURE, LOCKTYPE_RWLOCK); \
pr_cont("\n");
+#define DO_TESTCASE_1RR(desc, name, nr) \
+ print_testname(desc"/"#nr); \
+ pr_cont(" |"); \
+ dotest(name##_##nr, SUCCESS, LOCKTYPE_RWLOCK); \
+ pr_cont("\n");
+
+#define DO_TESTCASE_1RRB(desc, name, nr) \
+ print_testname(desc"/"#nr); \
+ pr_cont(" |"); \
+ dotest(name##_##nr, FAILURE, LOCKTYPE_RWLOCK); \
+ pr_cont("\n");
+
+
#define DO_TESTCASE_3(desc, name, nr) \
print_testname(desc"/"#nr); \
dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN); \
@@ -1366,6 +1506,22 @@ static inline void print_testname(const char *testname)
DO_TESTCASE_2IB(desc, name, 312); \
DO_TESTCASE_2IB(desc, name, 321);
+#define DO_TESTCASE_6x1RR(desc, name) \
+ DO_TESTCASE_1RR(desc, name, 123); \
+ DO_TESTCASE_1RR(desc, name, 132); \
+ DO_TESTCASE_1RR(desc, name, 213); \
+ DO_TESTCASE_1RR(desc, name, 231); \
+ DO_TESTCASE_1RR(desc, name, 312); \
+ DO_TESTCASE_1RR(desc, name, 321);
+
+#define DO_TESTCASE_6x1RRB(desc, name) \
+ DO_TESTCASE_1RRB(desc, name, 123); \
+ DO_TESTCASE_1RRB(desc, name, 132); \
+ DO_TESTCASE_1RRB(desc, name, 213); \
+ DO_TESTCASE_1RRB(desc, name, 231); \
+ DO_TESTCASE_1RRB(desc, name, 312); \
+ DO_TESTCASE_1RRB(desc, name, 321);
+
#define DO_TESTCASE_6x6(desc, name) \
DO_TESTCASE_6I(desc, name, 123); \
DO_TESTCASE_6I(desc, name, 132); \
@@ -2134,6 +2290,11 @@ void locking_selftest(void)
pr_cont(" |");
dotest(rlock_chaincache_ABBA1, FAILURE, LOCKTYPE_RWLOCK);
+ DO_TESTCASE_6x1RRB("rlock W1R2/W2R3/W3R1", W1R2_W2R3_W3R1);
+ DO_TESTCASE_6x1RRB("rlock W1W2/R2R3/W3R1", W1W2_R2R3_W3R1);
+ DO_TESTCASE_6x1RR("rlock W1W2/R2R3/R3W1", W1W2_R2R3_R3W1);
+ DO_TESTCASE_6x1RR("rlock W1R2/R2R3/W3W1", W1R2_R2R3_W3W1);
+
printk(" --------------------------------------------------------------------------\n");
/*
--
2.14.1
Back to linux.kernel | Previous | Next | Find similar | Unroll thread
[RFC tip/locking/lockdep v3 13/14] lockdep/selftest: Add more recursive read related test cases Boqun Feng <boqun.feng@gmail.com> - 2017-09-26 00:20 +0200
csiph-web