]> www.infradead.org Git - users/dwmw2/linux.git/commit
cpu/hotplug: Add dynamic parallel bringup states before CPUHP_BRINGUP_CPU
authorDavid Woodhouse <dwmw@amazon.co.uk>
Wed, 1 Feb 2023 20:43:32 +0000 (20:43 +0000)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 2 Feb 2023 09:20:43 +0000 (09:20 +0000)
commit3ca766c2d139b5427e409daccce9c094423f13d9
tree5eb07bee57c469addf69812679cf2b5078b5e293
parenta52a8ce8f3bfd31827b0c5fe3eadb8fad4c86952
cpu/hotplug: Add dynamic parallel bringup states before CPUHP_BRINGUP_CPU

If the platform registers these states, bring all CPUs to each registered
state in turn, before the final bringup to CPUHP_BRINGUP_CPU. This allows
the architecture to parallelise the slow asynchronous tasks like sending
INIT/SIPI and waiting for the AP to come to life.

There is a subtlety here: even with an empty CPUHP_BP_PARALLEL_DYN step,
this means that *all* CPUs are brought through the prepare states and to
CPUHP_BP_PREPARE_DYN before any of them are taken to CPUHP_BRINGUP_CPU
and then are allowed to run for themselves to CPUHP_ONLINE.

So any combination of prepare/start calls which depend on A-B ordering
for each CPU in turn, such as the X2APIC code which used to allocate a
cluster mask 'just in case' and store it in a global variable in the
prep stage, then potentially consume that preallocated structure from
the AP and set the global pointer to NULL to be reallocated in
CPUHP_X2APIC_PREPARE for the next CPU... would explode horribly.

We believe that X2APIC was the only such case, for x86. But this is why
it remains an architecture opt-in. For now.

Note that the new parallel stages do *not* yet bring each AP to the
CPUHP_BRINGUP_CPU state. The final loop in bringup_nonboot_cpus() is
untouched, bringing each AP in turn from the final PARALLEL_DYN state
(or all the way from CPUHP_OFFLINE) to CPUHP_BRINGUP_CPU and then
waiting for that AP to do its own processing and reach CPUHP_ONLINE
before releasing the next. Parallelising that part by bringing them all
to CPUHP_BRINGUP_CPU and then waiting for them all is an exercise for
the future.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
include/linux/cpuhotplug.h
kernel/cpu.c