Re: [PATCH v2 05/23] arm64: cpufeature: Check arm64_ftr_regs[] before the first store
From: Jinjie Ruan
Date: Fri Oct 09 2026 - 22:49:54 EST
在 2026/10/9 18:07, Will Deacon 写道:
> From: Fuad Tabba <fuad.tabba@xxxxxxxxx>
>
> sort_ftr_regs() sorts nothing. It checks that arm64_ftr_regs[] is in
> sys_id order, which the binary search in get_arm64_ftr_reg() relies on,
> and that no register's fields overlap. It runs at the top of
It also checks whether the register field extends beyond 64 bits
> init_cpu_features(), after the boot CPU's __cpuinfo_store_cpu(). A
> subsequent patch makes __cpuinfo_store_cpu() look registers up in the
> table.
>
> Rename it validate_ftr_regs() and call it from smp_prepare_boot_cpu(),
> ahead of cpuinfo_store_boot_cpu().
>
> Suggested-by: Will Deacon <will@xxxxxxxxxx>
> Signed-off-by: Fuad Tabba <fuad.tabba@xxxxxxxxx>
> Signed-off-by: Will Deacon <will@xxxxxxxxxx>
> ---
> arch/arm64/include/asm/cpu.h | 1 +
> arch/arm64/kernel/cpufeature.c | 5 +----
> arch/arm64/kernel/smp.c | 2 ++
> 3 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm64/include/asm/cpu.h b/arch/arm64/include/asm/cpu.h
> index 3c008821219c..f332fbd8e46d 100644
> --- a/arch/arm64/include/asm/cpu.h
> +++ b/arch/arm64/include/asm/cpu.h
> @@ -75,6 +75,7 @@ DECLARE_PER_CPU(struct cpuinfo_arm64, cpu_data);
> void cpuinfo_store_cpu(void);
> void __init cpuinfo_store_boot_cpu(void);
>
> +void __init validate_ftr_regs(void);
> void __init init_cpu_features(struct cpuinfo_arm64 *info);
> void update_cpu_features(int cpu, struct cpuinfo_arm64 *info,
> struct cpuinfo_arm64 *boot);
> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
> index 32102c3912fa..727e1665c987 100644
> --- a/arch/arm64/kernel/cpufeature.c
> +++ b/arch/arm64/kernel/cpufeature.c
> @@ -962,7 +962,7 @@ s64 arm64_ftr_safe_value(const struct arm64_ftr_bits *ftrp, s64 new,
> return ret;
> }
>
> -static void __init sort_ftr_regs(void)
> +void __init validate_ftr_regs(void)
> {
> unsigned int i;
>
> @@ -1207,9 +1207,6 @@ bool gmid_el1_accessible(const struct cpuinfo_arm64 *info)
>
> void __init init_cpu_features(struct cpuinfo_arm64 *info)
> {
> - /* Before we start using the tables, make sure it is sorted */
> - sort_ftr_regs();
> -
> init_cpu_ftr_reg(SYS_CTR_EL0, info->reg_ctr);
> init_cpu_ftr_reg(SYS_DCZID_EL0, info->reg_dczid);
> init_cpu_ftr_reg(SYS_CNTFRQ_EL0, info->reg_cntfrq);
> diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
> index a61dc3016a11..eac217b9ebf1 100644
> --- a/arch/arm64/kernel/smp.c
> +++ b/arch/arm64/kernel/smp.c
> @@ -455,6 +455,8 @@ void __init smp_prepare_boot_cpu(void)
> */
> set_my_cpu_offset(per_cpu_offset(smp_processor_id()));
>
> + /* Check arm64_ftr_regs[] before anything looks registers up in it. */
> + validate_ftr_regs();
Reviewed-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx>
> cpuinfo_store_boot_cpu();
> setup_boot_cpu_features();
>
--
Best regards,
Jinjie