[PATCH 00/19] arm64: Implement parallel CPU onlining with PSCI v0.2+

Will Deacon will at kernel.org
Mon Sep 7 09:40:03 PDT 2026


Hi folks,

This series implements CONFIG_HOTPLUG_PARALLEL for arm64 by utilising
the argument to CPU_ON introduced in PSCI v0.2. This supersedes the
previous series from Jinjie [1], and I'm grateful to him for his support
getting this alternative version in shape for posting.

I previously spoke at KVM forum about this work last year:

  https://www.youtube.com/watch?v=Q6kOshnnQuE

There are three major benefits realised by these changes:

1. We ditch our home-brew secondary CPU synchronisation in favour of
   constructs in the core code.

2. They offer a performance advantage on some platforms, where getting a
   CPU into the kernel can take time. I'm hoping Jinjie can provide
   numbers in this case.

3. When used inside a confidential guest, they provide protection
   against a malicious VMM that puts secondary CPUs into the guest
   kernel after the onlining operation has timed out.

The first four patches are small changes to the generic code to make it
a little more "Arm-shaped" but the rest of the series is largely
confined to the arm64 architecture and PSCI driver code.

The series is based on -rc2, as it otherwise conflicts with Fuad's GMID
fix that was recently merged upstream.

All feedback welcome,

Will

[1] https://lore.kernel.org/all/20260624092537.2916971-1-ruanjinjie@huawei.com/

Cc: Thomas Gleixner <tglx at kernel.org>
Cc: Catalin Marinas <catalin.marinas at arm.com>
Cc: Borislav Petkov <bp at alien8.de>
Cc: Lorenzo Pieralisi <lpieralisi at kernel.org>
Cc: Jinjie Ruan <ruanjinjie at huawei.com>
Cc: Mark Rutland <mark.rutland at arm.com>
Cc: David Woodhouse <dwmw at amazon.co.uk>
Cc: Peter Zijlstra <peterz at infradead.org>
Cc: Marc Zyngier <maz at kernel.org>

--->8

Will Deacon (19):
  cpu/hotplug: Clean up cmpxchg() logic in cpuhp_can_boot_ap()
  cpu/hotplug: Avoid trying to bring up CPUs that are already online
  cpu/hotplug: Avoid busy-polling on archs where cpu_relax() is a no-op
  cpu/hotplug: Propagate bring-up status to
    arch_cpuhp_cleanup_kick_cpu()
  arm64: smp: Tidy up smp_prepare_cpus()
  arm64: smp: Tidy up cpuinfo init and cpufeature updates
  arm64: smp: Defer update of secondary CPU capabilities
  arm64: smp: Don't bother printing the I-cache policy for each CPU
  arm64: smp: Defer RCU registration during secondary CPU bringup
  arm64: smp: Use generic HOTPLUG_CORE_SYNC_FULL machinery for CPU
    onlining
  arm64: smp: Use generic HOTPLUG_SPLIT_STARTUP machinery for CPU
    onlining
  arm64: cpu_ops: Make 'cpu_operations' pointer global instead of
    per-cpu
  arm64: cpu_ops: Introduce get_secondary_cpu_ops()
  firmware/psci: Cache PSCI v0.2+ version number to avoid redundant SMCs
  firmware/psci: Extend ->cpu_on() callback to take an additional
    argument
  arm64: cpu_ops: Expose optional argument to target cpu in ->cpu_boot()
  arm64: smp: Pass secondary CPU boot parameters via firmware if
    possible
  arm64: smp: Use generic HOTPLUG_PARALLEL machinery for CPU onlining
  arm64: smp: Harden parallel CPU bringup against broken PSCI firmware

 arch/arm/kernel/psci_smp.c                |   4 +-
 arch/arm64/Kconfig                        |   2 +-
 arch/arm64/include/asm/cpu.h              |   7 +-
 arch/arm64/include/asm/cpu_ops.h          |   7 +-
 arch/arm64/include/asm/smp.h              |  40 +--
 arch/arm64/include/asm/topology.h         |   2 +
 arch/arm64/kernel/acpi_parking_protocol.c |   3 +-
 arch/arm64/kernel/asm-offsets.c           |   1 +
 arch/arm64/kernel/cpu_ops.c               |  34 ++-
 arch/arm64/kernel/cpufeature.c            | 322 ++++++++++++----------
 arch/arm64/kernel/cpuinfo.c               |  27 --
 arch/arm64/kernel/head.S                  |  64 ++++-
 arch/arm64/kernel/psci.c                  |  13 +-
 arch/arm64/kernel/smp.c                   | 179 ++++++------
 arch/arm64/kernel/smp_spin_table.c        |   2 +-
 arch/arm64/mm/mmu.c                       |   2 +-
 arch/x86/kernel/smpboot.c                 |   6 +-
 drivers/firmware/psci/psci.c              |  27 +-
 include/linux/cpuhotplug.h                |   4 +-
 include/linux/psci.h                      |   3 +-
 include/linux/rcutree.h                   |   2 +-
 kernel/cpu.c                              |  28 +-
 22 files changed, 429 insertions(+), 350 deletions(-)

-- 
2.55.0.979.g7e5102b832-goog




More information about the linux-arm-kernel mailing list