summaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/smpboot.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2023-05-12 23:07:17 +0200
committerPeter Zijlstra <peterz@infradead.org>2023-05-15 13:44:53 +0200
commit9d349d47f0e39b4d1b68793ded2459daa1f948f0 (patch)
treed3f00d8c37867b3b98609ce9402cb87f29a8ab68 /arch/x86/kernel/smpboot.c
parentd4f28f07c2fe736bce8ca415a86fb74c629200f3 (diff)
downloadlinux-9d349d47f0e39b4d1b68793ded2459daa1f948f0.tar.gz
linux-9d349d47f0e39b4d1b68793ded2459daa1f948f0.tar.bz2
linux-9d349d47f0e39b4d1b68793ded2459daa1f948f0.zip
x86/smpboot: Make TSC synchronization function call based
Spin-waiting on the control CPU until the AP reaches the TSC synchronization is just a waste especially in the case that there is no synchronization required. As the synchronization has to run with interrupts disabled the control CPU part can just be done from a SMP function call. The upcoming AP issues that call async only in the case that synchronization is required. 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/20230512205256.148255496@linutronix.de
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
-rw-r--r--arch/x86/kernel/smpboot.c20
1 files changed, 3 insertions, 17 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 8b07c6e6d620..b2f44a837ce1 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -275,11 +275,7 @@ static void notrace start_secondary(void *unused)
*/
smp_callin();
- /*
- * Check TSC synchronization with the control CPU, which will do
- * its part of this from wait_cpu_online(), making it an implicit
- * synchronization point.
- */
+ /* Check TSC synchronization with the control CPU. */
check_tsc_sync_target();
/*
@@ -1141,21 +1137,11 @@ static void wait_cpu_callin(unsigned int cpu)
}
/*
- * Bringup step four: Synchronize the TSC and wait for the target AP
- * to reach set_cpu_online() in start_secondary().
+ * Bringup step four: Wait for the target AP to reach set_cpu_online() in
+ * start_secondary().
*/
static void wait_cpu_online(unsigned int cpu)
{
- unsigned long flags;
-
- /*
- * Check TSC synchronization with the AP (keep irqs disabled
- * while doing so):
- */
- local_irq_save(flags);
- check_tsc_sync_source(cpu);
- local_irq_restore(flags);
-
/*
* Wait for the AP to mark itself online, so the core caller
* can drop sparse_irq_lock.