Linux RCU subsystem development
 help / color / mirror / Atom feed
From: Joel Fernandes <joelagnelf@nvidia.com>
To: linux-kernel@vger.kernel.org, Davidlohr Bueso <dave@stgolabs.net>,
	"Paul E. McKenney" <paulmck@kernel.org>,
	Josh Triplett <josh@joshtriplett.org>,
	Frederic Weisbecker <frederic@kernel.org>,
	Neeraj Upadhyay <neeraj.upadhyay@kernel.org>,
	Joel Fernandes <joel@joelfernandes.org>,
	Boqun Feng <boqun.feng@gmail.com>,
	Uladzislau Rezki <urezki@gmail.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	Lai Jiangshan <jiangshanlai@gmail.com>,
	Zqiang <qiang.zhang1211@gmail.com>
Cc: rcu@vger.kernel.org, kernel test robot <oliver.sang@intel.com>,
	Joel Fernandes <joelagnelf@nvidia.com>
Subject: [PATCH 09/14] rcutorture: Check for ->up_read() without matching ->down_read()
Date: Fri, 18 Apr 2025 12:09:41 -0400	[thread overview]
Message-ID: <20250418161005.2425391-10-joelagnelf@nvidia.com> (raw)
In-Reply-To: <20250418161005.2425391-1-joelagnelf@nvidia.com>

From: "Paul E. McKenney" <paulmck@kernel.org>

This commit creates counters in the rcu_torture_one_read_state_updown
structure that check for a call to ->up_read() that lacks a matching
call to ->down_read().

While in the area, add end-of-run cleanup code that prevents calls to
rcu_torture_updown_hrt() from happening after the test has moved on.  Yes,
the srcu_barrier() at the end of the test will wait for them, but this
could result in confusing states, statistics, and diagnostic information.
So explicitly wait for them before we get to the end-of-test output.

[ paulmck: Apply kernel test robot feedback. ]

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Tested-by: kernel test robot <oliver.sang@intel.com>
Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com>
---
 kernel/rcu/rcutorture.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 0b998609c7dc..402b9979e95a 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -2439,6 +2439,8 @@ struct rcu_torture_one_read_state_updown {
 	struct hrtimer rtorsu_hrt;
 	bool rtorsu_inuse;
 	unsigned long rtorsu_j;
+	unsigned long rtorsu_ndowns;
+	unsigned long rtorsu_nups;
 	struct torture_random_state rtorsu_trs;
 	struct rcu_torture_one_read_state rtorsu_rtors;
 };
@@ -2453,6 +2455,8 @@ static enum hrtimer_restart rcu_torture_updown_hrt(struct hrtimer *hrtp)
 
 	rtorsup = container_of(hrtp, struct rcu_torture_one_read_state_updown, rtorsu_hrt);
 	rcu_torture_one_read_end(&rtorsup->rtorsu_rtors, &rtorsup->rtorsu_trs, -1);
+	WARN_ONCE(rtorsup->rtorsu_nups >= rtorsup->rtorsu_ndowns, "%s: Up without matching down #%zu.\n", __func__, rtorsup - updownreaders);
+	rtorsup->rtorsu_nups++;
 	smp_store_release(&rtorsup->rtorsu_inuse, false);
 	return HRTIMER_NORESTART;
 }
@@ -2497,8 +2501,12 @@ static void rcu_torture_updown_cleanup(void)
 	for (rtorsup = updownreaders; rtorsup < &updownreaders[n_up_down]; rtorsup++) {
 		if (!smp_load_acquire(&rtorsup->rtorsu_inuse))
 			continue;
-		if (!hrtimer_cancel(&rtorsup->rtorsu_hrt))
-			WARN_ON_ONCE(rtorsup->rtorsu_inuse);
+		if (hrtimer_cancel(&rtorsup->rtorsu_hrt) || WARN_ON_ONCE(rtorsup->rtorsu_inuse)) {
+			rcu_torture_one_read_end(&rtorsup->rtorsu_rtors, &rtorsup->rtorsu_trs, -1);
+			WARN_ONCE(rtorsup->rtorsu_nups >= rtorsup->rtorsu_ndowns, "%s: Up without matching down #%zu.\n", __func__, rtorsup - updownreaders);
+			rtorsup->rtorsu_nups++;
+			smp_store_release(&rtorsup->rtorsu_inuse, false);
+		}
 
 	}
 	kfree(updownreaders);
@@ -2514,10 +2522,13 @@ static void rcu_torture_updown_one(struct rcu_torture_one_read_state_updown *rto
 
 	init_rcu_torture_one_read_state(&rtorsup->rtorsu_rtors, &rtorsup->rtorsu_trs);
 	rawidx = cur_ops->down_read();
+	rtorsup->rtorsu_ndowns++;
 	idx = (rawidx << RCUTORTURE_RDR_SHIFT_1) & RCUTORTURE_RDR_MASK_1;
 	rtorsup->rtorsu_rtors.readstate = idx | RCUTORTURE_RDR_UPDOWN;
 	rtorsup->rtorsu_rtors.rtrsp++;
 	if (!rcu_torture_one_read_start(&rtorsup->rtorsu_rtors, &rtorsup->rtorsu_trs, -1)) {
+		WARN_ONCE(rtorsup->rtorsu_nups >= rtorsup->rtorsu_ndowns, "%s: Up without matching down #%zu.\n", __func__, rtorsup - updownreaders);
+		rtorsup->rtorsu_nups++;
 		schedule_timeout_idle(HZ);
 		return;
 	}
-- 
2.43.0


  parent reply	other threads:[~2025-04-18 16:10 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-18 16:09 [PATCH 00/14] RCU torture changes for v6.16 Joel Fernandes
2025-04-18 16:09 ` [PATCH 01/14] rcutorture: Make srcu_lockdep.sh check kernel Kconfig Joel Fernandes
2025-04-18 16:09 ` [PATCH 02/14] rcutorture: Make srcu_lockdep.sh check reader-conflict handling Joel Fernandes
2025-04-18 16:09 ` [PATCH 03/14] rcutorture: Split out beginning and end from rcu_torture_one_read() Joel Fernandes
2025-04-18 16:09 ` [PATCH 04/14] rcutorture: Make torture.sh --do-rt use CONFIG_PREEMPT_RT Joel Fernandes
2025-04-18 16:09 ` [PATCH 05/14] rcutorture: Add tests for SRCU up/down reader primitives Joel Fernandes
2025-04-18 16:09 ` [PATCH 06/14] rcutorture: Pull rcu_torture_updown() loop body into new function Joel Fernandes
2025-04-18 16:09 ` [PATCH 07/14] rcutorture: Comment invocations of tick_dep_set_task() Joel Fernandes
2025-04-18 16:09 ` [PATCH 08/14] rcutorture: Complain if an ->up_read() is delayed more than 10 seconds Joel Fernandes
2025-04-18 16:09 ` Joel Fernandes [this message]
2025-04-18 20:26   ` [PATCH 09/14] rcutorture: Check for ->up_read() without matching ->down_read() Joel Fernandes
2025-04-18 16:09 ` [PATCH 10/14] checkpatch: Deprecate srcu_read_lock_lite() and srcu_read_unlock_lite() Joel Fernandes
2025-04-18 16:09 ` [PATCH 11/14] torture: Add --do-{,no-}normal to torture.sh Joel Fernandes
2025-04-18 16:09 ` [PATCH 12/14] torture: Add testing of RCU's Rust bindings " Joel Fernandes
2025-04-18 17:31   ` Miguel Ojeda
2025-04-18 18:04     ` Paul E. McKenney
2025-04-18 18:32       ` Miguel Ojeda
2025-04-18 20:28         ` Paul E. McKenney
2025-04-18 22:29           ` [12/14] " Joel Fernandes
2025-04-18 22:45             ` Paul E. McKenney
2025-04-19 22:24               ` Joel Fernandes
2025-04-20  0:17                 ` Paul E. McKenney
2025-04-18 22:29           ` Joel Fernandes
2025-04-18 16:09 ` [PATCH 13/14] rcutorture: Perform more frequent testing of ->gpwrap Joel Fernandes
2025-04-18 16:09 ` [PATCH 14/14] rcutorture: Fix issue with re-using old images on ARM64 Joel Fernandes
2025-04-18 16:09 ` [PATCH 01/12] rcutorture: Make srcu_lockdep.sh check kernel Kconfig Joel Fernandes
2025-04-18 16:09 ` [PATCH 02/12] rcutorture: Make srcu_lockdep.sh check reader-conflict handling Joel Fernandes
2025-04-18 16:09 ` [PATCH 03/12] rcutorture: Split out beginning and end from rcu_torture_one_read() Joel Fernandes
2025-04-18 16:09 ` [PATCH 04/12] rcutorture: Make torture.sh --do-rt use CONFIG_PREEMPT_RT Joel Fernandes
2025-04-18 16:09 ` [PATCH 05/12] rcutorture: Add tests for SRCU up/down reader primitives Joel Fernandes
2025-04-18 16:09 ` [PATCH 06/12] rcutorture: Pull rcu_torture_updown() loop body into new function Joel Fernandes
2025-04-18 16:09 ` [PATCH 07/12] rcutorture: Comment invocations of tick_dep_set_task() Joel Fernandes
2025-04-18 16:09 ` [PATCH 08/12] rcutorture: Complain if an ->up_read() is delayed more than 10 seconds Joel Fernandes
2025-04-18 16:09 ` [PATCH 09/12] rcutorture: Check for ->up_read() without matching ->down_read() Joel Fernandes
2025-04-18 16:09 ` [PATCH 10/12] checkpatch: Deprecate srcu_read_lock_lite() and srcu_read_unlock_lite() Joel Fernandes
2025-04-18 16:09 ` [PATCH 11/12] torture: Add --do-{,no-}normal to torture.sh Joel Fernandes
2025-04-18 16:09 ` [PATCH 12/12] torture: Add testing of RCU's Rust bindings " Joel Fernandes
2025-04-18 16:23 ` [PATCH 00/14] RCU torture changes for v6.16 Joel Fernandes

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=20250418161005.2425391-10-joelagnelf@nvidia.com \
    --to=joelagnelf@nvidia.com \
    --cc=boqun.feng@gmail.com \
    --cc=dave@stgolabs.net \
    --cc=frederic@kernel.org \
    --cc=jiangshanlai@gmail.com \
    --cc=joel@joelfernandes.org \
    --cc=josh@joshtriplett.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=neeraj.upadhyay@kernel.org \
    --cc=oliver.sang@intel.com \
    --cc=paulmck@kernel.org \
    --cc=qiang.zhang1211@gmail.com \
    --cc=rcu@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=urezki@gmail.com \
    /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