[PATCH v3 09/12] arm64: cpufeature: Ensure atomic updates to system_cpucaps bitmap
Will Deacon
will at kernel.org
Mon Jul 6 10:40:50 PDT 2026
On Wed, Jun 24, 2026 at 05:25:34PM +0800, Jinjie Ruan wrote:
> Parallel CPU bringup allows multiple secondary CPUs to concurrently
> execute update_cpu_capabilities() during early boot.
>
> The current non-atomic __set_bit() and __clear_bit() helpers perform
> unserialized updates on the shared global bitmap, risking data races
> and feature flag erasure.
>
> Upgrade these operations to set_bit() and clear_bit() to ensure all
> concurrent modifications are properly serialized via arm64 atomics.
>
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>
> ---
> arch/arm64/kernel/cpufeature.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
> index be75e60d56ca..a1a13f3e01ed 100644
> --- a/arch/arm64/kernel/cpufeature.c
> +++ b/arch/arm64/kernel/cpufeature.c
> @@ -3548,7 +3548,7 @@ static void update_cpu_capabilities(u16 scope_mask)
>
> if (!caps->matches(caps, cpucap_default_scope(caps))) {
> if (match_all)
> - __clear_bit(caps->capability, system_cpucaps);
> + clear_bit(caps->capability, system_cpucaps);
> continue;
> }
>
> @@ -3559,7 +3559,7 @@ static void update_cpu_capabilities(u16 scope_mask)
> if (!match_all && caps->desc && !caps->cpus)
> pr_info("detected: %s\n", caps->desc);
>
> - __set_bit(caps->capability, system_cpucaps);
> + set_bit(caps->capability, system_cpucaps);
>
> if (boot_cpu && (caps->type & SCOPE_BOOT_CPU))
> set_bit(caps->capability, boot_cpucaps);
I don't think this is sufficient. Even if we use atomic updates for the
low-level bits, the logic here which tries to avoid re-probing features
that have already been detected isn't going to work correctly if it's
running concurrently with itself.
I think the best bet is probably to move update_cpu_capabilities() out
of check_local_cpu_capabilities() and call it after cpuhp_ap_sync_alive()
when the system capabilities are not yet finalised. WDYT? That means
we'd have something akin to setup_boot_cpu_features() for the secondary
CPUs.
Will
More information about the linux-arm-kernel
mailing list