linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Boqun Feng <boqun.feng@gmail.com>
To: linux-kernel@vger.kernel.org
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>, Boqun Feng <boqun.feng@gmail.com>
Subject: [RFC tip/locking/lockdep v4 10/17] lockdep/selftest: Add a R-L/L-W test case specific to chain cache behavior
Date: Tue,  9 Jan 2018 22:38:53 +0800	[thread overview]
Message-ID: <20180109143900.27475-11-boqun.feng@gmail.com> (raw)
In-Reply-To: <20180109143900.27475-1-boqun.feng@gmail.com>

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.15.1

  parent reply	other threads:[~2018-01-09 14:37 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-09 14:38 [RFC tip/locking/lockdep v4 00/17] lockdep: Support deadlock detection for recursive read locks Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 01/17] lockdep: Demagic the return value of BFS Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 02/17] lockdep: Make __bfs() visit every dependency until a match Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 03/17] lockdep: Redefine LOCK_*_STATE* bits Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 04/17] lockdep: Introduce lock_list::dep Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 05/17] lockdep: Extend __bfs() to work with multiple kinds of dependencies Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 06/17] lockdep: Support deadlock detection for recursive read in check_noncircular() Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 07/17] lockdep: Adjust check_redundant() for recursive read change Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 08/17] lockdep: Fix recursive read lock related safe->unsafe detection Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 09/17] lockdep: Add recursive read locks into dependency graph Boqun Feng
2018-01-09 14:38 ` Boqun Feng [this message]
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 11/17] lockdep: Take read/write status in consideration when generate chainkey Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 12/17] lockdep/selftest: Unleash irq_read_recursion2 and add more Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 13/17] lockdep/selftest: Add more recursive read related test cases Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 14/17] Revert "locking/lockdep/selftests: Fix mixed read-write ABBA tests" Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 15/17] lockdep: Reduce the size of lock_list Boqun Feng
2018-01-09 14:38 ` [RFC tip/locking/lockdep v4 16/17] lockdep: Documention for recursive read lock detection reasoning Boqun Feng
2018-01-25  1:05   ` Randy Dunlap
2018-01-25  1:40     ` Boqun Feng
2018-01-09 14:39 ` [RFC tip/locking/lockdep v4 17/17] MAINTAINERS: Add myself as a LOCKING PRIMITIVES reviewer Boqun Feng

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=20180109143900.27475-11-boqun.feng@gmail.com \
    --to=boqun.feng@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.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).