From: Peter Zijlstra <peterz@infradead.org>
To: wangqk1 <wangqk1@xiaopeng.com>
Cc: linux-kernel@vger.kernel.org, xiedl3@xiaopeng.com,
mingo@redhat.com, juri.lelli@redhat.com,
vincent.guittot@linaro.org, bigeasy@linutronix.de,
clrkwllms@kernel.org, rostedt@goodmis.org,
linux-rt-devel@lists.linux.dev
Subject: Re: [RFC 1/1] sched/rt: Avoid RTO push to stopped CPUs during shutdown
Date: Tue, 13 Oct 2026 14:03:02 +0200 [thread overview]
Message-ID: <20261013120302.GJ2009045@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <20261013030140.682182-2-wangqk1@xiaopeng.com>
On Tue, Oct 13, 2026 at 11:01:40AM +0800, wangqk1 wrote:
> During system poweroff, machine_power_off() invokes smp_send_stop(). A
> CPU receiving IPI_CPU_STOP parks without running the CPU hotplug teardown.
> Its RT overload state can therefore retain a stale rto_mask bit.
>
> A CPU still executing the RTO irq_work iterator can select that stale bit
> and queue work to the stopped CPU.
>
> Observed call trace:
> irq_work_queue_on()
> rto_push_irq_work_func()
> irq_work_single()
> __flush_smp_call_function_queue()
> generic_smp_call_function_single_interrupt()
> ipi_handler()
>
> Stop RTO forwarding after terminal system states begin and skip rto_mask
> candidates that are already offline.
>
> This is a workaround, not a complete synchronization protocol. The
> cpu_online() test is not atomic with irq_work_queue_on(), and panic or
> crash-kexec paths do not set a terminal system_state before stopping CPUs.
>
> Signed-off-by: wangqk1 <wangqk1@xiaopeng.com>
> ---
> kernel/sched/rt.c | 20 +++++++++++++++++++-
> 1 file changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
> index 85303add726d..716ac30c5afb 100644
> --- a/kernel/sched/rt.c
> +++ b/kernel/sched/rt.c
> @@ -2084,6 +2084,14 @@ static void push_rt_tasks(struct rq *rq)
>
> #ifdef HAVE_RT_PUSH_IPI
>
> +static inline bool rto_push_allowed(void)
> +{
> + enum system_states state = READ_ONCE(system_state);
> +
> + return state != SYSTEM_HALT && state != SYSTEM_POWER_OFF &&
> + state != SYSTEM_RESTART;
> +}
> +
> /*
> * When a high priority task schedules out from a CPU and a lower priority
> * task is scheduled in, a check is made to see if there's any RT tasks
> @@ -2131,6 +2139,11 @@ static int rto_next_cpu(struct root_domain *rd)
> int next;
> int cpu;
>
> + if (unlikely(!rto_push_allowed())) {
> + rd->rto_cpu = -1;
> + return -1;
> + }
> +
> /*
> * When starting the IPI RT pushing, the rto_cpu is set to -1,
> * rt_next_cpu() will simply return the first CPU found in
> @@ -2155,8 +2168,13 @@ static int rto_next_cpu(struct root_domain *rd)
> if (cpu == this_cpu)
> continue;
>
> - if (cpu < nr_cpu_ids)
> + if (cpu < nr_cpu_ids) {
> + /* smp_send_stop() does not clear stale rto_mask bits. */
> + if (!cpu_online(cpu))
> + continue;
> +
> return cpu;
> + }
>
> rd->rto_cpu = -1;
This is horrific; lets not do this. The bug really is at the place where
you randomly and without warning take CPUs down. We're not adding random
hacks for things like that.
prev parent reply other threads:[~2026-10-13 12:03 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-13 3:01 [RFC 0/1] " wangqk1
2026-10-13 3:01 ` [RFC 1/1] " wangqk1
2026-10-13 12:03 ` Peter Zijlstra [this message]
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=20261013120302.GJ2009045@noisy.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=bigeasy@linutronix.de \
--cc=clrkwllms@kernel.org \
--cc=juri.lelli@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-devel@lists.linux.dev \
--cc=mingo@redhat.com \
--cc=rostedt@goodmis.org \
--cc=vincent.guittot@linaro.org \
--cc=wangqk1@xiaopeng.com \
--cc=xiedl3@xiaopeng.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
all inboxes | Powered by JetHome®