[PATCH 10/19] arm64: smp: Use generic HOTPLUG_CORE_SYNC_FULL machinery for CPU onlining
Jinjie Ruan
ruanjinjie at huawei.com
Tue Sep 8 02:01:00 PDT 2026
在 2026/9/8 0:40, Will Deacon 写道:
> Select HOTPLUG_CORE_SYNC_FULL on arm64 to replace the 'cpu_running'
> completion with the generic code for synchronising with secondary CPUs
> during boot.
>
> Signed-off-by: Will Deacon <will at kernel.org>
> ---
> arch/arm64/Kconfig | 2 +-
> arch/arm64/include/asm/smp.h | 1 -
> arch/arm64/kernel/smp.c | 39 +++++++++++++++++-------------------
> 3 files changed, 19 insertions(+), 23 deletions(-)
>
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index b5a51b0ef944..89d1f0f2269c 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -230,7 +230,7 @@ config ARM64
> select HAVE_SYSCALL_TRACEPOINTS
> select HAVE_KPROBES
> select HAVE_KRETPROBES
> - select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU
> + select HOTPLUG_CORE_SYNC_FULL
> select HOTPLUG_SMT if HOTPLUG_CPU
> select IRQ_DOMAIN
> select IRQ_FORCED_THREADING
> diff --git a/arch/arm64/include/asm/smp.h b/arch/arm64/include/asm/smp.h
> index 10ea4f543069..fe343c30d620 100644
> --- a/arch/arm64/include/asm/smp.h
> +++ b/arch/arm64/include/asm/smp.h
> @@ -12,7 +12,6 @@
> #define CPU_BOOT_STATUS_MASK ((UL(1) << CPU_STUCK_REASON_SHIFT) - 1)
>
> #define CPU_MMU_OFF (-1)
> -#define CPU_BOOT_SUCCESS (0)
> /* The cpu invoked ops->cpu_die, synchronise it with cpu_kill */
> #define CPU_KILL_ME (1)
> /* The cpu couldn't die gracefully and is looping in the kernel */
> diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
> index ff68640d0c0b..00362ed6e1ab 100644
> --- a/arch/arm64/kernel/smp.c
> +++ b/arch/arm64/kernel/smp.c
> @@ -108,12 +108,9 @@ static int boot_secondary(unsigned int cpu, struct task_struct *idle)
> return -EOPNOTSUPP;
> }
>
> -static DECLARE_COMPLETION(cpu_running);
> -
> int __cpu_up(unsigned int cpu, struct task_struct *idle)
> {
> int ret;
> - long status;
>
> /*
> * We need to tell the secondary core where to find its stack and the
> @@ -124,27 +121,24 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle)
>
> /* Now bring the CPU into our world */
> ret = boot_secondary(cpu, idle);
> - if (ret) {
> - if (ret != -EPERM)
> - pr_err("CPU%u: failed to boot: %d\n", cpu, ret);
> - return ret;
> - }
> + if (ret && ret != -EPERM)
> + pr_err("CPU%u: failed to boot: %d\n", cpu, ret);
> + return ret;
> +}
>
> - /*
> - * CPU was successfully started, wait for it to come online or
> - * time out.
> - */
> - wait_for_completion_timeout(&cpu_running,
> - msecs_to_jiffies(5000));
> - if (cpu_online(cpu))
> - return 0;
> +void arch_cpuhp_cleanup_kick_cpu(unsigned int cpu, bool is_alive)
> +{
> + long status;
> +
> + if (is_alive)
> + return;
>
> - pr_crit("CPU%u: failed to come online\n", cpu);
> secondary_data.task = NULL;
> status = READ_ONCE(secondary_data.status);
> if (status == CPU_MMU_OFF)
> status = READ_ONCE(__early_cpu_boot_status);
>
> + /* A CPU has failed to boot. Try to figure out what happened. */
> switch (status & CPU_BOOT_STATUS_MASK) {
> default:
> pr_err("CPU%u: failed in unknown state : 0x%lx\n",
> @@ -171,8 +165,6 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle)
> case CPU_PANIC_KERNEL:
> panic("CPU%u detected unsupported configuration\n", cpu);
> }
> -
> - return -EIO;
> }
>
> static void init_gic_priority_masking(void)
> @@ -234,6 +226,13 @@ asmlinkage notrace void secondary_start_kernel(void)
> * Log the CPU info before it is marked online and might get read.
> */
> cpuinfo_store_cpu();
> +
> + /*
> + * Synchronise with the core bringing us online so that it knows
> + * we made it into the kernel. We're still not 'online'.
> + */
> + cpuhp_ap_sync_alive();
> +
> update_cpu_features(cpu);
> store_cpu_topology(cpu);
>
> @@ -255,9 +254,7 @@ asmlinkage notrace void secondary_start_kernel(void)
> pr_info("CPU%u: Booted secondary processor 0x%010lx [0x%08x]\n",
> cpu, (unsigned long)mpidr,
> read_cpuid_id());
> - update_cpu_boot_status(CPU_BOOT_SUCCESS);
> set_cpu_online(cpu, true);
> - complete(&cpu_running);
Reviewed-by: Jinjie Ruan <ruanjinjie at huawei.com>
>
> /*
> * Secondary CPUs enter the kernel with all DAIF exceptions masked.
More information about the linux-arm-kernel
mailing list