mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 16:13:19 +09:00
cpu/hotplug: Allow "parallel" bringup up to CPUHP_BP_KICK_AP_STATE
There is often significant latency in the early stages of CPU bringup, and time is wasted by waking each CPU (e.g. with SIPI/INIT/INIT on x86) and then waiting for it to respond before moving on to the next. Allow a platform to enable parallel setup which brings all to be onlined CPUs up to the CPUHP_BP_KICK_AP state. While this state advancement on the control CPU (BP) is single-threaded the important part is the last state CPUHP_BP_KICK_AP which wakes the to be onlined CPUs up. This allows the CPUs to run up to the first sychronization point cpuhp_ap_sync_alive() where they wait for the control CPU to release them one by one for the full onlining procedure. This parallelism depends on the CPU hotplug core sync mechanism which ensures that the parallel brought up CPUs wait for release before touching any state which would make the CPU visible to anything outside the hotplug control mechanism. To handle the SMT constraints of X86 correctly the bringup happens in two iterations when CONFIG_HOTPLUG_SMT is enabled. The control CPU brings up the primary SMT threads of each core first, which can load the microcode without the need to rendevouz with the thread siblings. Once that's completed it brings up the secondary SMT threads. Co-developed-by: David Woodhouse <dwmw@amazon.co.uk> Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Michael Kelley <mikelley@microsoft.com> Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name> Tested-by: Helge Deller <deller@gmx.de> # parisc Tested-by: Guilherme G. Piccoli <gpiccoli@igalia.com> # Steam Deck Link: https://lore.kernel.org/r/20230512205257.240231377@linutronix.de
This commit is contained in:
committed by
Peter Zijlstra
parent
f54d4434c2
commit
18415f33e2
@@ -524,6 +524,7 @@ void cpuhp_ap_sync_alive(void);
|
||||
void arch_cpuhp_sync_state_poll(void);
|
||||
void arch_cpuhp_cleanup_kick_cpu(unsigned int cpu);
|
||||
int arch_cpuhp_kick_ap_alive(unsigned int cpu, struct task_struct *tidle);
|
||||
bool arch_cpuhp_init_parallel_bringup(void);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CORE_SYNC_DEAD
|
||||
void cpuhp_ap_report_dead(void);
|
||||
|
||||
Reference in New Issue
Block a user