Re: [PATCH v6 18/21] arm64: Prevent offlining first CPU with 32-bit EL0 on mismatched system
From: Catalin Marinas
Date: Mon May 24 2021 - 12:09:22 EST
On Tue, May 18, 2021 at 10:47:22AM +0100, Will Deacon wrote:
> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
> index 959442f76ed7..72efdc611b14 100644
> --- a/arch/arm64/kernel/cpufeature.c
> +++ b/arch/arm64/kernel/cpufeature.c
> @@ -2896,15 +2896,33 @@ void __init setup_cpu_features(void)
>
> static int enable_mismatched_32bit_el0(unsigned int cpu)
> {
> + static int lucky_winner = -1;
> +
> struct cpuinfo_arm64 *info = &per_cpu(cpu_data, cpu);
> bool cpu_32bit = id_aa64pfr0_32bit_el0(info->reg_id_aa64pfr0);
>
> if (cpu_32bit) {
> cpumask_set_cpu(cpu, cpu_32bit_el0_mask);
> static_branch_enable_cpuslocked(&arm64_mismatched_32bit_el0);
> - setup_elf_hwcaps(compat_elf_hwcaps);
> }
>
> + if (cpumask_test_cpu(0, cpu_32bit_el0_mask) == cpu_32bit)
> + return 0;
I don't fully understand this early return. AFAICT, we still call
setup_elf_hwcaps() via setup_cpu_features() if the system supports
32-bit EL0 (mismatched or not) at boot. For CPU hotplug, we can add the
compat hwcaps later if we didn't set them up at boot. So this part is
fine.
However, if CPU0 is 32-bit-capable, it looks like we'd never disable the
offlining on any of the 32-bit-capable CPUs and there's nothing that
prevents offlining CPU0.
--
Catalin