From: "Chuyi Zhou" <zhouchuyi@bytedance.com>
To: <tglx@linutronix.de>, <mingo@redhat.com>, <luto@kernel.org>,
<peterz@infradead.org>, <paulmck@kernel.org>,
<muchun.song@linux.dev>, <bp@alien8.de>,
<dave.hansen@linux.intel.com>, <pbonzini@redhat.com>,
<bigeasy@linutronix.de>, <clrkwllms@kernel.org>,
<rostedt@goodmis.org>, <nadav.amit@gmail.com>
Cc: <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v4 03/12] smp: Remove get_cpu from smp_call_function_any
Date: Thu, 9 Apr 2026 11:48:19 +0800 [thread overview]
Message-ID: <88a1be12-d16e-45cc-adb1-690423b08793@bytedance.com> (raw)
In-Reply-To: <20260331113103.2197007-4-zhouchuyi@bytedance.com>
On 2026-03-31 7:30 p.m., Chuyi Zhou wrote:
> Now smp_call_function_single() would enable preemption before
> csd_lock_wait() to reduce the critical section. To allow callers of
> smp_call_function_any() to also benefit from this optimization, remove
> get_cpu()/put_cpu() from smp_call_function_any().
>
> Signed-off-by: Chuyi Zhou <zhouchuyi@bytedance.com>
> Reviewed-by: Muchun Song <muchun.song@linux.dev>
> ---
> kernel/smp.c | 16 +++++++++++++---
> 1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/smp.c b/kernel/smp.c
> index b603d4229f95..80daf9dd4a25 100644
> --- a/kernel/smp.c
> +++ b/kernel/smp.c
> @@ -761,16 +761,26 @@ EXPORT_SYMBOL_GPL(smp_call_function_single_async);
> int smp_call_function_any(const struct cpumask *mask,
> smp_call_func_t func, void *info, int wait)
> {
> + bool local = true;
> unsigned int cpu;
> int ret;
>
> - /* Try for same CPU (cheapest) */
> + /*
> + * Prevent migration to another CPU after selecting the current CPU
> + * as the target.
> + */
> cpu = get_cpu();
> - if (!cpumask_test_cpu(cpu, mask))
> +
> + /* Try for same CPU (cheapest) */
> + if (!cpumask_test_cpu(cpu, mask)) {
> cpu = sched_numa_find_nth_cpu(mask, 0, cpu_to_node(cpu));
> + local = false;
> + put_cpu();
> + }
>
From sashiko[1]:
' By calling put_cpu() before smp_call_function_single() for remote
CPUs, does this open a preemption window where the selected remote CPU
could be fully offlined before the IPI is dispatched?
If the selected CPU goes offline in this window,
smp_call_function_single() will fail the cpu_online() check and return
-ENXIO. Because this function does not retry with another CPU from the
mask, it propagates -ENXIO directly to the caller even if other valid
online CPUs remain in the mask.
Could this cause spurious failures for callers in preemptible contexts
that do not hold CPU hotplug locks, violating the guarantee to run on
any online CPU in the mask? '
This causes smp_call_function_any() to return -ENXIO immediately, rather
than returning -ENXIO only when all CPUs are offline.
One way to fix this is to refactor the logic of smp_call_function_any()
and smp_call_function_single(), moving the target CPU selection logic
into smp_call_function_single() and keeping preemption disabled until
the IPI is sent out.
Another approach is to retry sched_numa_find_nth_cpu() once
smp_call_function_single() returns -ENXIO, until
sched_numa_find_nth_cpu() returns nr_cpu_ids.
Do you have any better suggestions?
Thanks.
[1]
https://sashiko.dev/#/patchset/20260331113103.2197007-1-zhouchuyi%40bytedance.com
> ret = smp_call_function_single(cpu, func, info, wait);
> - put_cpu();
> + if (local)
> + put_cpu();
> return ret;
> }
> EXPORT_SYMBOL_GPL(smp_call_function_any);
next prev parent reply other threads:[~2026-04-09 3:49 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-31 11:30 [PATCH v4 00/12] Allow preemption during IPI completion waiting to improve real-time performance Chuyi Zhou
2026-03-31 11:30 ` [PATCH v4 01/12] smp: Disable preemption explicitly in __csd_lock_wait Chuyi Zhou
2026-03-31 11:30 ` [PATCH v4 02/12] smp: Enable preemption early in smp_call_function_single Chuyi Zhou
2026-03-31 11:30 ` [PATCH v4 03/12] smp: Remove get_cpu from smp_call_function_any Chuyi Zhou
2026-04-09 3:48 ` Chuyi Zhou [this message]
2026-03-31 11:30 ` [PATCH v4 04/12] smp: Use task-local IPI cpumask in smp_call_function_many_cond() Chuyi Zhou
2026-04-01 15:25 ` Sebastian Andrzej Siewior
2026-04-01 15:38 ` Chuyi Zhou
2026-03-31 11:30 ` [PATCH v4 05/12] smp: Alloc percpu csd data in smpcfd_prepare_cpu() only once Chuyi Zhou
2026-03-31 11:30 ` [PATCH v4 06/12] smp: Enable preemption early in smp_call_function_many_cond Chuyi Zhou
2026-03-31 11:30 ` [PATCH v4 07/12] smp: Remove preempt_disable from smp_call_function Chuyi Zhou
2026-03-31 11:30 ` [PATCH v4 08/12] smp: Remove preempt_disable from on_each_cpu_cond_mask Chuyi Zhou
2026-03-31 11:31 ` [PATCH v4 09/12] scftorture: Remove preempt_disable in scftorture_invoke_one Chuyi Zhou
2026-03-31 11:31 ` [PATCH v4 10/12] x86/mm: Move flush_tlb_info back to the stack Chuyi Zhou
2026-03-31 11:31 ` [PATCH v4 11/12] x86/mm: Enable preemption during native_flush_tlb_multi Chuyi Zhou
2026-03-31 11:31 ` [PATCH v4 12/12] x86/mm: Enable preemption during flush_tlb_kernel_range Chuyi Zhou
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=88a1be12-d16e-45cc-adb1-690423b08793@bytedance.com \
--to=zhouchuyi@bytedance.com \
--cc=bigeasy@linutronix.de \
--cc=bp@alien8.de \
--cc=clrkwllms@kernel.org \
--cc=dave.hansen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=muchun.song@linux.dev \
--cc=nadav.amit@gmail.com \
--cc=paulmck@kernel.org \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
/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®