From 0cdd03eba8235d33457227f995a2fd85ed46950e Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 6 Oct 2026 10:26:56 -0300 Subject: [PATCH] smp: fix race between cpu exposure and smp init The SMP code exposes that a cpu woke up before it is properly initialized in sched_ap_entry(). Fix this by initializing it first, exposing it and then stopping the bootstrap thread. --- kernel-src/arch/x86-64/smp.c | 5 ++++- kernel-src/sys/scheduler/scheduler.c | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel-src/arch/x86-64/smp.c b/kernel-src/arch/x86-64/smp.c index 70495425..404cb6d5 100644 --- a/kernel-src/arch/x86-64/smp.c +++ b/kernel-src/arch/x86-64/smp.c @@ -50,8 +50,11 @@ static void cpuwakeup(struct limine_mp_info *info) { arch_profiling_init(); #endif - __atomic_add_fetch(&arch_smp_cpusawake, 1, __ATOMIC_SEQ_CST); sched_ap_entry(); + + __atomic_add_fetch(&arch_smp_cpusawake, 1, __ATOMIC_SEQ_CST); + + sched_stop_current_thread(); } void arch_smp_send_ipi(cpu_t *targcpu, isr_t *isr, int target, bool nmi) { diff --git a/kernel-src/sys/scheduler/scheduler.c b/kernel-src/sys/scheduler/scheduler.c index 5b0b6a0b..a7fd8ebd 100644 --- a/kernel-src/sys/scheduler/scheduler.c +++ b/kernel-src/sys/scheduler/scheduler.c @@ -376,7 +376,6 @@ void sched_ap_entry() { timer_insert(current_cpu()->timer, ¤t_cpu()->schedtimerentry, reschedule_timer_dpc, NULL, QUANTUM_US, true); timer_insert(current_cpu()->timer, ¤t_cpu()->calendar_tick_timer_entry, sched_calendar_tick, NULL, 10000, true); timer_resume(current_cpu()->timer); - sched_stop_current_thread(); } void sched_init() {