Linux Documentation
 help / color / mirror / Atom feed
From: Bradley Morgan <brads@mainlining.org>
To: shenxiaogll@gmail.com
Cc: boqun@kernel.org, corbet@lwn.net, frederic@kernel.org,
	jiangshanlai@gmail.com, joelagnelf@nvidia.com,
	josh@joshtriplett.org, linux-doc@vger.kernel.org,
	linux-kernel@vger.kernel.org, mathieu.desnoyers@efficios.com,
	neeraj.upadhyay@kernel.org, paulmck@kernel.org,
	qiang.zhang@linux.dev, rcu@vger.kernel.org,
	rdunlap@infradead.org, rostedt@goodmis.org,
	skhan@linuxfoundation.org, urezki@gmail.com
Subject: Re: [PATCH] rcu: Enable runtime reset of the RCU stall panic count
Date: Sun, 04 Oct 2026 12:04:35 +0100	[thread overview]
Message-ID: <7D1519BB-3576-4BAA-B08A-89F4D775A15D@mainlining.org> (raw)
In-Reply-To: <20261004-rcu-v1-1-3799a44367f1@gmail.com>

On 4 October 2026 02:14:25 BST, Cunlong Li <shenxiaogll@gmail.com> wrote:
>The kernel.panic_on_rcu_stall and kernel.max_rcu_stall_to_panic sysctls
>count RCU CPU stalls since system boot, and invoke panic() once
>max_rcu_stall_to_panic stalls have elapsed.  This count is never reset,
>so stalls caused by transient incidents keep consuming the budget of a
>long-running system, and a later unrelated stall can immediately
>trigger panic() instead of allowing the intended fresh window of
>stalls.
>
>This commit therefore introduces the kernel.rcu_stall_panic_count
>sysctl.  Reading this file reports the number of stalls counted so far,
>and writing 0 to it resets the count.  This allows the cumulative stall
>history to be cleared after an incident has been resolved, and also
>allows userspace to clear the count periodically, so that panic() is
>only triggered by a burst of stalls occurring within a short period.
>

Hi, LGTM!


Reviewed-by: Bradley Morgan <brads@mainlining.org>


>Signed-off-by: Cunlong Li <shenxiaogll@gmail.com>
>---
> Documentation/admin-guide/sysctl/kernel.rst | 15 ++++++++++++++-
> kernel/rcu/tree_stall.h                     | 28
> ++++++++++++++++++++++++++--
> 2 files changed, 40 insertions(+), 3 deletions(-)
>
>diff --git a/Documentation/admin-guide/sysctl/kernel.rst b/Documentation/admin-guide/sysctl/kernel.rst
>index ffea61d448eb..64fe2985e358 100644
>--- a/Documentation/admin-guide/sysctl/kernel.rst
>+++ b/Documentation/admin-guide/sysctl/kernel.rst
>@@ -959,7 +959,20 @@ max_rcu_stall_to_panic
> When ``panic_on_rcu_stall`` is set to 1, this value determines the
> number of times that RCU can stall before panic() is called.
> 
>-When ``panic_on_rcu_stall`` is set to 0, this value is has no effect.
>+When ``panic_on_rcu_stall`` is set to 0, this value has no effect.
>+
>+rcu_stall_panic_count
>+=====================
>+
>+Indicates the number of RCU CPU stalls that have been counted since
>+system boot or since the counter was reset. When ``panic_on_rcu_stall``
>+is set to 1, this count is compared against ``max_rcu_stall_to_panic``
>+to decide whether panic() should be called.
>+
>+Writing 0 to this file resets the counter to zero, which restarts the
>+``max_rcu_stall_to_panic`` window of stalls. This allows system
>+administrators to clear the cumulative stall count after an incident
>+has been resolved, without requiring a system restart.
> 
> perf_cpu_time_max_percent
> =========================
>diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h
>index 091e7850ab6e..a80f03e1c7ea 100644
>--- a/kernel/rcu/tree_stall.h
>+++ b/kernel/rcu/tree_stall.h
>@@ -19,6 +19,20 @@
> /* panic() on RCU Stall sysctl. */
> static int sysctl_panic_on_rcu_stall __read_mostly;
> static int sysctl_max_rcu_stall_to_panic __read_mostly;
>+static unsigned long sysctl_rcu_stall_panic_count;
>+
>+/* Reset the RCU stall panic count when written to. */
>+static int proc_do_rcu_stall_panic_count(const struct ctl_table *table, int write,
>+					 void *buffer, size_t *lenp, loff_t *ppos)
>+{
>+	if (!write)
>+		return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
>+
>+	WRITE_ONCE(sysctl_rcu_stall_panic_count, 0);
>+	*ppos += *lenp;
>+
>+	return 0;
>+}
> 
> static const struct ctl_table rcu_stall_sysctl_table[] = {
> 	{
>@@ -39,6 +53,13 @@ static const struct ctl_table rcu_stall_sysctl_table[] = {
> 		.extra1		= SYSCTL_ONE,
> 		.extra2		= SYSCTL_INT_MAX,
> 	},
>+	{
>+		.procname	= "rcu_stall_panic_count",
>+		.data		= &sysctl_rcu_stall_panic_count,
>+		.maxlen		= sizeof(sysctl_rcu_stall_panic_count),
>+		.mode		= 0644,
>+		.proc_handler	= proc_do_rcu_stall_panic_count,
>+	},
> };
> 
> static int __init init_rcu_stall_sysctl(void)
>@@ -161,7 +182,7 @@ early_initcall(check_cpu_stall_init);
> /* If so specified via sysctl, panic, yielding cleaner stall-warning
> output. */
> static void panic_on_rcu_stall(const struct cpumask *stalled_mask)
> {
>-	static int cpu_stall;
>+	unsigned long count;
> 
> 	/*
> 	 * Attempt to kick out the BPF scheduler if it's installed and defer
>@@ -170,7 +191,10 @@ static void panic_on_rcu_stall(const struct cpumask *stalled_mask)
> 	if (scx_rcu_cpu_stall(stalled_mask))
> 		return;
> 
>-	if (++cpu_stall < sysctl_max_rcu_stall_to_panic)
>+	/* A lost RMW update only delays the panic by one stall. */
>+	count = READ_ONCE(sysctl_rcu_stall_panic_count) + 1;
>+	WRITE_ONCE(sysctl_rcu_stall_panic_count, count);
>+	if (count < (unsigned long)READ_ONCE(sysctl_max_rcu_stall_to_panic))
> 		return;
> 
> 	if (sysctl_panic_on_rcu_stall)
>
>---
>base-commit: ce1e0223d8ad4211275c82a17ed6d43ab81e13d9
>change-id: 20261003-rcu-375496d7704e
>
>Best regards,
>

--- Thanks!
"I'm not a very positive person" - Linus torvalds

  reply	other threads:[~2026-10-04 11:04 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-04  1:14 [PATCH] rcu: Enable runtime reset of the RCU stall panic count Cunlong Li
2026-10-04 11:04 ` Bradley Morgan [this message]
2026-10-05 12:56 ` Joel Fernandes
2026-10-06 11:54   ` Cunlong Li
2026-10-06 12:21     ` Joel Fernandes
2026-10-06 12:39     ` Joel Fernandes
2026-10-06 13:17       ` Cunlong Li
2026-10-06 21:27         ` Joel Fernandes
2026-10-07  2:56           ` Cunlong Li
  -- strict thread matches above, loose matches on Subject: below --
2026-10-07 10:46 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=7D1519BB-3576-4BAA-B08A-89F4D775A15D@mainlining.org \
    --to=brads@mainlining.org \
    --cc=boqun@kernel.org \
    --cc=corbet@lwn.net \
    --cc=frederic@kernel.org \
    --cc=jiangshanlai@gmail.com \
    --cc=joelagnelf@nvidia.com \
    --cc=josh@joshtriplett.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=neeraj.upadhyay@kernel.org \
    --cc=paulmck@kernel.org \
    --cc=qiang.zhang@linux.dev \
    --cc=rcu@vger.kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=shenxiaogll@gmail.com \
    --cc=skhan@linuxfoundation.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