summaryrefslogtreecommitdiff
path: root/arch/x86/kernel/smpboot.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2023-05-12 23:07:12 +0200
committerPeter Zijlstra <peterz@infradead.org>2023-05-15 13:44:51 +0200
commite94cd1503b153ea753f0c4ed9d5ed12e7abd1306 (patch)
tree96af41fa02c9e248e174d95c38ca586d89e3ad42 /arch/x86/kernel/smpboot.c
parent2b3be65d2e4f4bb9358b039b99ad1a391dd3c311 (diff)
downloadlinux-e94cd1503b153ea753f0c4ed9d5ed12e7abd1306.tar.gz
linux-e94cd1503b153ea753f0c4ed9d5ed12e7abd1306.tar.bz2
linux-e94cd1503b153ea753f0c4ed9d5ed12e7abd1306.zip
x86/smpboot: Get rid of cpu_init_secondary()
The synchronization of the AP with the control CPU is a SMP boot problem and has nothing to do with cpu_init(). Open code cpu_init_secondary() in start_secondary() and move wait_for_master_cpu() into the SMP boot code. No functional change. 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/20230512205255.981999763@linutronix.de
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
-rw-r--r--arch/x86/kernel/smpboot.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 0bd9c9f7861f..50eff9b7fe7f 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -220,6 +220,17 @@ static void ap_calibrate_delay(void)
cpu_data(smp_processor_id()).loops_per_jiffy = loops_per_jiffy;
}
+static void wait_for_master_cpu(int cpu)
+{
+ /*
+ * Wait for release by control CPU before continuing with AP
+ * initialization.
+ */
+ WARN_ON(cpumask_test_and_set_cpu(cpu, cpu_initialized_mask));
+ while (!cpumask_test_cpu(cpu, cpu_callout_mask))
+ cpu_relax();
+}
+
/*
* Activate a secondary processor.
*/
@@ -237,13 +248,16 @@ static void notrace start_secondary(void *unused)
load_cr3(swapper_pg_dir);
__flush_tlb_all();
#endif
+ cpu_init_exception_handling();
+
/*
- * Sync point with wait_cpu_initialized(). Before proceeding through
- * cpu_init(), the AP will call wait_for_master_cpu() which sets its
- * own bit in cpu_initialized_mask and then waits for the BSP to set
- * its bit in cpu_callout_mask to release it.
+ * Sync point with wait_cpu_initialized(). Sets AP in
+ * cpu_initialized_mask and then waits for the control CPU
+ * to release it.
*/
- cpu_init_secondary();
+ wait_for_master_cpu(raw_smp_processor_id());
+
+ cpu_init();
rcu_cpu_starting(raw_smp_processor_id());
x86_cpuinit.early_percpu_clock_init();