From: Yury Norov <yury.norov@gmail.com>
To: Rik van Riel <riel@surriel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Jann Horn <jannh@google.com>,
syzbot <syzbot+084b6e5bc1016723a9c4@syzkaller.appspotmail.com>,
bp@alien8.de, dave.hansen@linux.intel.com, hpa@zytor.com,
linux-kernel@vger.kernel.org, luto@kernel.org, mingo@redhat.com,
neeraj.upadhyay@kernel.org, paulmck@kernel.org,
peterz@infradead.org, syzkaller-bugs@googlegroups.com,
x86@kernel.org, kernel-team <kernel-team@meta.com>,
David Hildenbrand <david@redhat.com>
Subject: Re: [PATCH] smp: Wait for enqueued work regardless of IPI sent
Date: Thu, 3 Jul 2025 09:52:53 -0400 [thread overview]
Message-ID: <aGaLNRWhskWisP_0@yury> (raw)
In-Reply-To: <20250702135954.7a00497d@fangorn>
On Wed, Jul 02, 2025 at 01:59:54PM -0400, Rik van Riel wrote:
> On Wed, 2 Jul 2025 13:44:34 -0400
> Yury Norov <yury.norov@gmail.com> wrote:
>
> > Thank you guys for explaining that and sorry for the buggy patch.
> > I was actually under impression that run_remote duplicates nr_cpus !=0,
> > and even have a patch that removes run_remote.
> >
> > Maybe worth to add a comment on what run_remote and nr_cpus track?
>
> This thread did surface some useful content, and Jann also pointed out
> a good optimization that can be made, by not setting run_remote if
> "func" tells us to skip remote CPUs.
>
> Thomas, please let me know if you already reverted Yury's patch,
> and want me to re-send this without the last hunk.
>
> ---8<---
> From 2ae6417fa7ce16f1bfa574cbabba572436adbed9 Mon Sep 17 00:00:00 2001
> From: Rik van Riel <riel@surriel.com>
> Date: Wed, 2 Jul 2025 13:52:54 -0400
> Subject: [PATCH] smp: Wait for enqueued work regardless of IPI sent
>
> Whenever work is enqueued with a remote CPU, smp_call_function_many_cond()
> may need to wait for that work to be completed, regardless of whether or
> not the remote CPU needed to be woken up with an IPI, or the work was
> being added to the queue of an already woken up CPU.
>
> However, if no work is enqueued with a remote CPU, because "func"
> told us to skip all CPUs, do not wait.
>
> Document the difference between "work enqueued", and "CPU needs to be
> woken up"
>
> Signed-off-by: Rik van Riel <riel@surriel.com>
> Suggested-by: Jann Horn <jannh@google.com>
> Reported-by: syzbot+084b6e5bc1016723a9c4@syzkaller.appspotmail.com
> Fixes: a12a498a9738 ("smp: Don't wait for remote work done if not needed in smp_call_function_many_cond()")
> ---
> kernel/smp.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/smp.c b/kernel/smp.c
> index 84561258cd22..c5e1da7a88da 100644
> --- a/kernel/smp.c
> +++ b/kernel/smp.c
> @@ -802,7 +802,6 @@ static void smp_call_function_many_cond(const struct cpumask *mask,
>
> /* Check if we need remote execution, i.e., any CPU excluding this one. */
> if (cpumask_any_and_but(mask, cpu_online_mask, this_cpu) < nr_cpu_ids) {
> - run_remote = true;
> cfd = this_cpu_ptr(&cfd_data);
> cpumask_and(cfd->cpumask, mask, cpu_online_mask);
> __cpumask_clear_cpu(this_cpu, cfd->cpumask);
> @@ -816,6 +815,9 @@ static void smp_call_function_many_cond(const struct cpumask *mask,
> continue;
> }
>
> + /* Work is enqueued on a remote CPU. */
> + run_remote = true;
> +
I actually ended up with the same on my cratch branch:
https://github.com/norov/linux/commit/8a32ca4b60dc68ac54f3b70b4be7a5863dc3934e
So,
Reviewed-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>
> csd_lock(csd);
> if (wait)
> csd->node.u_flags |= CSD_TYPE_SYNC;
> @@ -827,6 +829,10 @@ static void smp_call_function_many_cond(const struct cpumask *mask,
> #endif
> trace_csd_queue_cpu(cpu, _RET_IP_, func, csd);
>
> + /*
> + * Kick the remote CPU if this is the first work
> + * item enqueued.
> + */
> if (llist_add(&csd->node.llist, &per_cpu(call_single_queue, cpu))) {
> __cpumask_set_cpu(cpu, cfd->cpumask_ipi);
> nr_cpus++;
> @@ -843,8 +849,6 @@ static void smp_call_function_many_cond(const struct cpumask *mask,
> send_call_function_single_ipi(last_cpu);
> else if (likely(nr_cpus > 1))
> send_call_function_ipi_mask(cfd->cpumask_ipi);
> - else
> - run_remote = false;
> }
>
> /* Check if we need local execution. */
> --
> 2.49.0
>
next prev parent reply other threads:[~2025-07-03 13:52 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-02 13:50 [syzbot] [kernel?] KASAN: slab-use-after-free Write in flush_tlb_func syzbot
2025-07-02 15:20 ` Rik van Riel
2025-07-02 16:53 ` Jann Horn
2025-07-02 17:00 ` Jann Horn
2025-07-02 17:12 ` Thomas Gleixner
2025-07-02 17:44 ` Yury Norov
2025-07-02 17:59 ` [PATCH] smp: Wait for enqueued work regardless of IPI sent Rik van Riel
2025-07-03 13:52 ` Yury Norov [this message]
2025-07-03 16:56 ` Thomas Gleixner
2025-07-04 0:30 ` [PATCH v2] " Rik van Riel
2025-07-06 10:01 ` [tip: smp/core] smp: Wait only if work was enqueued tip-bot2 for Rik van Riel
2025-07-02 17:09 ` [syzbot] [kernel?] KASAN: slab-use-after-free Write in flush_tlb_func Rik van Riel
2025-07-02 17:23 ` Jann Horn
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=aGaLNRWhskWisP_0@yury \
--to=yury.norov@gmail.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=david@redhat.com \
--cc=hpa@zytor.com \
--cc=jannh@google.com \
--cc=kernel-team@meta.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=neeraj.upadhyay@kernel.org \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=riel@surriel.com \
--cc=syzbot+084b6e5bc1016723a9c4@syzkaller.appspotmail.com \
--cc=syzkaller-bugs@googlegroups.com \
--cc=tglx@linutronix.de \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.