From: Peter Zijlstra <peterz@infradead.org>
To: mingo@kernel.org
Cc: byungchul.park@lge.com, tj@kernel.org, boqun.feng@gmail.com,
david@fromorbit.com, johannes@sipsolutions.net, oleg@redhat.com,
linux-kernel@vger.kernel.org, peterz@infradead.org
Subject: [PATCH 2/4] lockdep/selftests: Add mixed read-write ABBA tests
Date: Wed, 23 Aug 2017 13:58:45 +0200 [thread overview]
Message-ID: <20170823121432.852405711@infradead.org> (raw)
In-Reply-To: 20170823115843.662056844@infradead.org
[-- Attachment #1: peterz-locking-selftest.patch --]
[-- Type: text/plain, Size: 3119 bytes --]
Currently lockdep has limited support for recursive readers, add a few
mixed read-write ABBA selftests to show the extend of these
limitations.
[ 0.000000] ----------------------------------------------------------------------------
[ 0.000000] | spin |wlock |rlock |mutex | wsem | rsem |
[ 0.000000] --------------------------------------------------------------------------
[ 0.000000] mixed read-lock/lock-write ABBA: |FAILED| | ok |
[ 0.000000] mixed read-lock/lock-read ABBA: | ok | | ok |
[ 0.000000] mixed write-lock/lock-write ABBA: | ok | | ok |
This clearly illustrates the case where lockdep fails to find a
deadlock.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
--- a/lib/locking-selftest.c
+++ b/lib/locking-selftest.c
@@ -363,6 +363,103 @@ static void rsem_AA3(void)
}
/*
+ * read_lock(A)
+ * spin_lock(B)
+ * spin_lock(B)
+ * write_lock(A)
+ */
+static void rlock_ABBA1(void)
+{
+ RL(X1);
+ L(Y1);
+ U(Y1);
+ RU(X1);
+
+ L(Y1);
+ WL(X1);
+ WU(X1);
+ U(Y1); // should fail
+}
+
+static void rwsem_ABBA1(void)
+{
+ RSL(X1);
+ ML(Y1);
+ MU(Y1);
+ RSU(X1);
+
+ ML(Y1);
+ WSL(X1);
+ WSU(X1);
+ MU(Y1); // should fail
+}
+
+/*
+ * read_lock(A)
+ * spin_lock(B)
+ * spin_lock(B)
+ * read_lock(A)
+ */
+static void rlock_ABBA2(void)
+{
+ RL(X1);
+ L(Y1);
+ U(Y1);
+ RU(X1);
+
+ L(Y1);
+ RL(X1);
+ RU(X1);
+ U(Y1); // should NOT fail
+}
+
+static void rwsem_ABBA2(void)
+{
+ RSL(X1);
+ ML(Y1);
+ MU(Y1);
+ RSU(X1);
+
+ ML(Y1);
+ RSL(X1);
+ RSU(X1);
+ MU(Y1); // should fail
+}
+
+
+/*
+ * write_lock(A)
+ * spin_lock(B)
+ * spin_lock(B)
+ * write_lock(A)
+ */
+static void rlock_ABBA3(void)
+{
+ WL(X1);
+ L(Y1);
+ U(Y1);
+ WU(X1);
+
+ L(Y1);
+ WL(X1);
+ WU(X1);
+ U(Y1); // should fail
+}
+
+static void rwsem_ABBA3(void)
+{
+ WSL(X1);
+ ML(Y1);
+ MU(Y1);
+ WSU(X1);
+
+ ML(Y1);
+ WSL(X1);
+ WSU(X1);
+ MU(Y1); // should fail
+}
+
+/*
* ABBA deadlock:
*/
@@ -1056,8 +1153,6 @@ static void dotest(void (*testcase_fn)(v
if (debug_locks != expected) {
unexpected_testcase_failures++;
pr_cont("FAILED|");
-
- dump_stack();
} else {
testcase_successes++;
pr_cont(" ok |");
@@ -1933,6 +2028,24 @@ void locking_selftest(void)
dotest(rsem_AA3, FAILURE, LOCKTYPE_RWSEM);
pr_cont("\n");
+ print_testname("mixed read-lock/lock-write ABBA");
+ pr_cont(" |");
+ dotest(rlock_ABBA1, FAILURE, LOCKTYPE_RWLOCK);
+ pr_cont(" |");
+ dotest(rwsem_ABBA1, FAILURE, LOCKTYPE_RWSEM);
+
+ print_testname("mixed read-lock/lock-read ABBA");
+ pr_cont(" |");
+ dotest(rlock_ABBA2, SUCCESS, LOCKTYPE_RWLOCK);
+ pr_cont(" |");
+ dotest(rwsem_ABBA2, FAILURE, LOCKTYPE_RWSEM);
+
+ print_testname("mixed write-lock/lock-write ABBA");
+ pr_cont(" |");
+ dotest(rlock_ABBA3, FAILURE, LOCKTYPE_RWLOCK);
+ pr_cont(" |");
+ dotest(rwsem_ABBA3, FAILURE, LOCKTYPE_RWSEM);
+
printk(" --------------------------------------------------------------------------\n");
/*
next prev parent reply other threads:[~2017-08-23 12:18 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-23 11:58 [PATCH 0/4] workqueue and lockdep stuffs Peter Zijlstra
2017-08-23 11:58 ` [PATCH 1/4] workqueue: Use TASK_IDLE Peter Zijlstra
2017-08-23 13:31 ` Tejun Heo
2017-08-23 11:58 ` Peter Zijlstra [this message]
2017-08-23 11:58 ` [PATCH 3/4] workqueue/lockdep: Fix flush_work() annotation Peter Zijlstra
2017-08-23 11:58 ` [PATCH 4/4] lockdep: Fix workqueue crossrelease annotation Peter Zijlstra
2017-08-24 2:18 ` Byungchul Park
2017-08-24 14:02 ` Peter Zijlstra
2017-08-25 1:11 ` Byungchul Park
2017-08-29 8:59 ` Peter Zijlstra
2017-08-29 14:23 ` [tip:locking/core] locking/lockdep: Untangle xhlock history save/restore from task independence tip-bot for Peter Zijlstra
2017-08-29 16:02 ` [PATCH 4/4] lockdep: Fix workqueue crossrelease annotation Byungchul Park
2017-08-29 18:47 ` Peter Zijlstra
2017-08-30 2:09 ` Byungchul Park
2017-08-30 7:41 ` Byungchul Park
2017-08-30 8:53 ` Peter Zijlstra
2017-08-30 9:01 ` Byungchul Park
2017-08-30 9:12 ` Peter Zijlstra
2017-08-30 9:14 ` Peter Zijlstra
2017-08-30 9:35 ` Byungchul Park
2017-08-30 9:24 ` Byungchul Park
2017-08-30 11:25 ` Byungchul Park
2017-08-30 12:49 ` Byungchul Park
2017-08-31 7:26 ` Byungchul Park
2017-08-31 8:04 ` Peter Zijlstra
2017-08-31 8:15 ` Byungchul Park
2017-08-31 8:34 ` Peter Zijlstra
2017-09-01 2:05 ` Byungchul Park
2017-09-01 9:47 ` Peter Zijlstra
2017-09-01 10:16 ` Byungchul Park
2017-09-01 12:09 ` 박병철/선임연구원/SW Platform(연)AOT팀(byungchul.park@lge.com)
2017-09-01 12:38 ` Peter Zijlstra
2017-09-01 13:51 ` Byungchul Park
2017-09-01 16:38 ` Peter Zijlstra
2017-09-04 1:30 ` Byungchul Park
2017-09-04 2:08 ` Byungchul Park
2017-09-04 11:42 ` Peter Zijlstra
2017-09-05 0:38 ` Byungchul Park
2017-09-05 7:08 ` Peter Zijlstra
2017-09-05 7:19 ` Peter Zijlstra
2017-09-05 8:57 ` Byungchul Park
2017-09-05 9:36 ` Peter Zijlstra
2017-09-05 10:31 ` Byungchul Park
2017-09-05 10:52 ` Peter Zijlstra
2017-09-05 11:24 ` Byungchul Park
2017-09-05 10:58 ` Byungchul Park
2017-09-05 13:46 ` Peter Zijlstra
2017-09-05 23:52 ` Byungchul Park
2017-09-06 0:42 ` Boqun Feng
2017-09-06 1:32 ` Byungchul Park
2017-09-06 23:59 ` Byungchul Park
2017-09-07 0:11 ` Byungchul Park
2017-09-06 0:48 ` Byungchul Park
2017-09-05 8:30 ` Byungchul Park
2017-08-31 8:07 ` Peter Zijlstra
2017-08-25 4:39 ` Byungchul Park
2017-08-29 6:46 ` Byungchul Park
2017-08-29 9:01 ` Peter Zijlstra
2017-08-29 16:12 ` Byungchul Park
2017-08-23 13:32 ` [PATCH 0/4] workqueue and lockdep stuffs Tejun Heo
2017-08-23 13:45 ` Peter Zijlstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170823121432.852405711@infradead.org \
--to=peterz@infradead.org \
--cc=boqun.feng@gmail.com \
--cc=byungchul.park@lge.com \
--cc=david@fromorbit.com \
--cc=johannes@sipsolutions.net \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).