Re: [PATCH 12/19] arm64: cpu_ops: Make 'cpu_operations' pointer global instead of per-cpu
From: Jinjie Ruan
Date: Tue Sep 15 2026 - 21:14:05 EST
在 2026/9/11 20:55, Will Deacon 写道:
> 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.
That's indeed the case — currently there's only one caller, and it
doesn't care what the return value is.
>
>> Otherwise LGTM
>> Reviewed-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx>
>
> Thanks,
>
> Will