[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