From: Andrea Righi <arighi@nvidia.com>
To: Michal Blaszczyk <michalblk@google.com>
Cc: Tejun Heo <tj@kernel.org>, David Vernet <void@manifault.com>,
Changwoo Min <changwoo@igalia.com>,
Kuba Piecuch <jpiecuch@google.com>,
sched-ext@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] sched_ext: Use atomic cpumask_clear_cpu in scx_idle_test_and_clear_cpu()
Date: Tue, 1 Sep 2026 18:20:09 +0200 [thread overview]
Message-ID: <apb7OapVwIDZV3D4@gpd4> (raw)
In-Reply-To: <20260901152212.1691696-1-michalblk@google.com>
Hi Michal,
On Tue, Sep 01, 2026 at 03:22:12PM +0000, Michal Blaszczyk wrote:
> In scx_idle_test_and_clear_cpu(), the shared idle_smts mask is modified
> locklessly by concurrent CPUs. Currently, the code uses
> __cpumask_clear_cpu() to clear a CPU from the mask. Because this is
> a non-atomic read-modify-write operation, concurrent modifications to
> different bits within the same memory word can lead to data races and
> lost updates.
>
> Fix this by replacing __cpumask_clear_cpu() with the atomic
> cpumask_clear_cpu().
I think the atomic clear makes sense here, but, as sashiko also pointed out, it
does not fully address the race, because idle_smts is also modified by the
non-atomic cpumask_andnot() below and cpumask_or() in update_builtin_idle().
>
> Fixes: 48849271e661 ("sched_ext: idle: Per-node idle cpumasks")
And the race existed way before this commit, the idle SMT tracking has been
always documented as racy and self-correcting.
This change may still be a best-effort improvement, but the commit message
should describe it in this way. Did you notice any improvements/benefits with
some workloads with this patch applied?
Thanks,
-Andrea
> Signed-off-by: Michal Blaszczyk <michalblk@google.com>
> ---
> kernel/sched/ext/idle.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kernel/sched/ext/idle.c b/kernel/sched/ext/idle.c
> index d2973fb3af6d..8985b48c83a5 100644
> --- a/kernel/sched/ext/idle.c
> +++ b/kernel/sched/ext/idle.c
> @@ -104,7 +104,7 @@ static bool scx_idle_test_and_clear_cpu(int cpu)
> if (cpumask_intersects(smt, idle_smts))
> cpumask_andnot(idle_smts, idle_smts, smt);
> else if (cpumask_test_cpu(cpu, idle_smts))
> - __cpumask_clear_cpu(cpu, idle_smts);
> + cpumask_clear_cpu(cpu, idle_smts);
> }
>
> return cpumask_test_and_clear_cpu(cpu, idle_cpus);
> --
> 2.55.0.897.gb25b4bd76c-goog
>
next prev parent reply other threads:[~2026-09-01 16:20 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-01 15:22 [PATCH] sched_ext: Use atomic cpumask_clear_cpu in scx_idle_test_and_clear_cpu() Michal Blaszczyk
2026-09-01 15:29 ` sashiko-bot
2026-09-01 16:20 ` Andrea Righi [this message]
2026-09-02 8:07 ` Michał Błaszczyk
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=apb7OapVwIDZV3D4@gpd4 \
--to=arighi@nvidia.com \
--cc=changwoo@igalia.com \
--cc=jpiecuch@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=michalblk@google.com \
--cc=sched-ext@lists.linux.dev \
--cc=tj@kernel.org \
--cc=void@manifault.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 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.