mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "tip-bot2 for Sebastian Andrzej Siewior" <tip-bot2@linutronix.de>
To: linux-tip-commits@vger.kernel.org
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	"Peter Zijlstra (Intel)" <peterz@infradead.org>,
	x86@kernel.org, linux-kernel@vger.kernel.org
Subject: [tip: locking/core] lockdep/selftests: Unbalanced migrate_disable() & rcu_read_lock().
Date: Mon, 06 Dec 2021 15:15:44 -0000	[thread overview]
Message-ID: <163880374446.11128.9971042846476247131.tip-bot2@tip-bot2> (raw)
In-Reply-To: <20211129174654.668506-8-bigeasy@linutronix.de>

The following commit has been merged into the locking/core branch of tip:

Commit-ID:     512bf713cb4c8a42ae76e5ba1a78e70a768af301
Gitweb:        https://git.kernel.org/tip/512bf713cb4c8a42ae76e5ba1a78e70a768af301
Author:        Sebastian Andrzej Siewior <bigeasy@linutronix.de>
AuthorDate:    Mon, 29 Nov 2021 18:46:50 +01:00
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Sat, 04 Dec 2021 10:56:24 +01:00

lockdep/selftests: Unbalanced migrate_disable() & rcu_read_lock().

The tests with unbalanced lock() + unlock() operation leave a modified
preemption counter behind which is then reset to its original value
after the test.

The spin_lock() function on PREEMPT_RT does not include a
preempt_disable() statement but migrate_disable() and read_rcu_lock().
As a consequence both counter never get back to their original value
and the system explodes later after the selftest.  In the
double-unlock case on PREEMPT_RT, the migrate_disable() and RCU code
will trigger a warning which should be avoided. These counter should
not be decremented below their initial value.

Save both counters and bring them back to their original value after
the test.  In the double-unlock case, increment both counter in
advance to they become balanced after the double unlock.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20211129174654.668506-8-bigeasy@linutronix.de
---
 lib/locking-selftest.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c
index 4d614c7..417056b 100644
--- a/lib/locking-selftest.c
+++ b/lib/locking-selftest.c
@@ -712,12 +712,18 @@ GENERATE_TESTCASE(ABCDBCDA_rtmutex);
 
 #undef E
 
+#ifdef CONFIG_PREEMPT_RT
+# define RT_PREPARE_DBL_UNLOCK()	{ migrate_disable(); rcu_read_lock(); }
+#else
+# define RT_PREPARE_DBL_UNLOCK()
+#endif
 /*
  * Double unlock:
  */
 #define E()					\
 						\
 	LOCK(A);				\
+	RT_PREPARE_DBL_UNLOCK();		\
 	UNLOCK(A);				\
 	UNLOCK(A); /* fail */
 
@@ -1398,7 +1404,13 @@ static int unexpected_testcase_failures;
 
 static void dotest(void (*testcase_fn)(void), int expected, int lockclass_mask)
 {
-	unsigned long saved_preempt_count = preempt_count();
+	int saved_preempt_count = preempt_count();
+#ifdef CONFIG_PREEMPT_RT
+#ifdef CONFIG_SMP
+	int saved_mgd_count = current->migration_disabled;
+#endif
+	int saved_rcu_count = current->rcu_read_lock_nesting;
+#endif
 
 	WARN_ON(irqs_disabled());
 
@@ -1432,6 +1444,18 @@ static void dotest(void (*testcase_fn)(void), int expected, int lockclass_mask)
 	 * count, so restore it:
 	 */
 	preempt_count_set(saved_preempt_count);
+
+#ifdef CONFIG_PREEMPT_RT
+#ifdef CONFIG_SMP
+	while (current->migration_disabled > saved_mgd_count)
+		migrate_enable();
+#endif
+
+	while (current->rcu_read_lock_nesting > saved_rcu_count)
+		rcu_read_unlock();
+	WARN_ON_ONCE(current->rcu_read_lock_nesting < saved_rcu_count);
+#endif
+
 #ifdef CONFIG_TRACE_IRQFLAGS
 	if (softirq_count())
 		current->softirqs_enabled = 0;

  reply	other threads:[~2021-12-06 15:29 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-29 17:46 [PATCH 00/11] lockdep: Unbreak lockdep's selftest work on PREEMPT_RT Sebastian Andrzej Siewior
2021-11-29 17:46 ` [PATCH 01/11] sched: Trigger warning if ->migration_disabled counter underflows Sebastian Andrzej Siewior
2021-12-02 21:02   ` Peter Zijlstra
2021-12-06 15:15   ` [tip: locking/core] " tip-bot2 for Sebastian Andrzej Siewior
2021-11-29 17:46 ` [PATCH 02/11] locking: Remove rt_rwlock_is_contended() Sebastian Andrzej Siewior
2021-12-06 15:15   ` [tip: locking/core] " tip-bot2 for Sebastian Andrzej Siewior
2021-11-29 17:46 ` [PATCH 03/11] locking/rtmutex: Squash self-deadlock check for ww_rt_mutex Sebastian Andrzej Siewior
2021-12-06 15:15   ` [tip: locking/core] " tip-bot2 for Peter Zijlstra
2021-11-29 17:46 ` [PATCH 04/11] locking/rtmutex: Add rt_mutex_lock_nest_lock() and rt_mutex_lock_killable() Sebastian Andrzej Siewior
2021-12-06 15:15   ` [tip: locking/core] " tip-bot2 for Sebastian Andrzej Siewior
2021-11-29 17:46 ` [PATCH 05/11] lockdep: Remove softirq accounting on PREEMPT_RT Sebastian Andrzej Siewior
2021-12-06 15:15   ` [tip: locking/core] " tip-bot2 for Thomas Gleixner
2021-11-29 17:46 ` [PATCH 06/11] lockdep/selftests: Avoid using local_lock_{acquire|release}() Sebastian Andrzej Siewior
2021-12-06 15:15   ` [tip: locking/core] " tip-bot2 for Sebastian Andrzej Siewior
2021-11-29 17:46 ` [PATCH 07/11] lockdep/selftests: Unbalanced migrate_disable() & rcu_read_lock() Sebastian Andrzej Siewior
2021-12-06 15:15   ` tip-bot2 for Sebastian Andrzej Siewior [this message]
2021-11-29 17:46 ` [PATCH 08/11] lockdep/selftests: Skip the softirq related tests on PREEMPT_RT Sebastian Andrzej Siewior
2021-12-06 15:15   ` [tip: locking/core] " tip-bot2 for Sebastian Andrzej Siewior
2021-11-29 17:46 ` [PATCH 09/11] lockdep/selftests: Adapt ww-tests for PREEMPT_RT Sebastian Andrzej Siewior
2021-12-06 15:15   ` [tip: locking/core] " tip-bot2 for Sebastian Andrzej Siewior
2021-11-29 17:46 ` [PATCH 10/11] x86/mm: Include spinlock_t definition in pgtable Sebastian Andrzej Siewior
2021-12-07 14:22   ` [tip: locking/core] " tip-bot2 for Sebastian Andrzej Siewior
2021-11-29 17:46 ` [PATCH 11/11] locking: Allow to include asm/spinlock_types.h from linux/spinlock_types_raw.h Sebastian Andrzej Siewior
2021-12-07 14:22   ` [tip: locking/core] " tip-bot2 for Sebastian Andrzej Siewior
2021-12-02 21:12 ` [PATCH 00/11] lockdep: Unbreak lockdep's selftest work on PREEMPT_RT Peter Zijlstra
2021-12-06 15:26   ` Sebastian Andrzej Siewior
2021-12-06 15:43     ` Peter Zijlstra
2021-12-07 14:19       ` Peter Zijlstra
2021-12-07 14:30         ` Sebastian Andrzej Siewior

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=163880374446.11128.9971042846476247131.tip-bot2@tip-bot2 \
    --to=tip-bot2@linutronix.de \
    --cc=bigeasy@linutronix.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=x86@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

all inboxes | Powered by JetHome®