[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