Re: [PATCH 12/19] arm64: cpu_ops: Make 'cpu_operations' pointer global instead of per-cpu
From: Will Deacon
Date: Fri Sep 11 2026 - 09:04:44 EST
On Tue, Sep 08, 2026 at 07:32:06PM +0800, Jinjie Ruan wrote:
> 在 2026/9/8 0:40, Will Deacon 写道:
> > diff --git a/arch/arm64/kernel/cpu_ops.c b/arch/arm64/kernel/cpu_ops.c
> > index e133011f64b5..eacfb88a0c0c 100644
> > --- a/arch/arm64/kernel/cpu_ops.c
> > +++ b/arch/arm64/kernel/cpu_ops.c
> > @@ -20,7 +20,8 @@ extern const struct cpu_operations acpi_parking_protocol_ops;
> > #endif
> > extern const struct cpu_operations cpu_psci_ops;
> >
> > -static const struct cpu_operations *cpu_ops[NR_CPUS] __ro_after_init;
> > +static const struct cpu_operations *cpu_ops __ro_after_init;
> > +static bool boot_cpu_has_enable_method __ro_after_init;
> >
> > static const struct cpu_operations *const dt_supported_cpu_ops[] __initconst = {
> > &smp_spin_table_ops,
> > @@ -40,6 +41,9 @@ static const struct cpu_operations * __init cpu_get_ops(const char *name)
> > {
> > const struct cpu_operations *const *ops;
> >
> > + if (!name)
> > + return NULL;
> > +
> > ops = acpi_disabled ? dt_supported_cpu_ops : acpi_supported_cpu_ops;
> >
> > while (*ops) {
> > @@ -49,6 +53,7 @@ static const struct cpu_operations * __init cpu_get_ops(const char *name)
> > ops++;
> > }
> >
> > + pr_warn("Unsupported enable-method: %s\n", name);
> > return NULL;
> > }
> >
> > @@ -94,25 +99,31 @@ static const char *__init cpu_read_enable_method(int cpu)
> > return enable_method;
> > }
> > /*
> > - * Read a cpu's enable method and record it in cpu_ops.
> > + * Read a cpu's enable method and update/check cpu_ops.
> > */
> > int __init init_cpu_ops(int cpu)
> > {
> > const char *enable_method = cpu_read_enable_method(cpu);
> > + const struct cpu_operations *ops = cpu_get_ops(enable_method);
> >
> > - if (!enable_method)
> > + if (!ops)
> > return -ENODEV;
> >
> > - cpu_ops[cpu] = cpu_get_ops(enable_method);
> > - if (!cpu_ops[cpu]) {
> > - pr_warn("Unsupported enable-method: %s\n", enable_method);
> > - return -EOPNOTSUPP;
> > - }
> > + if (!cpu_ops)
> > + cpu_ops = ops;
> > + else if (cpu_ops != ops)
> > + return -EBUSY;
>
> Should we return the original error code of init_cpu_ops() in
> smp_cpu_setup()?
I don't think it matters (the only caller of smp_cpu_setup() just cares
about 0 vs !0) and I don't see a reason to change it as part of this
series.
> Otherwise LGTM
> Reviewed-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx>
Thanks,
Will