From a971de89d3eeb4f8f1bb165df17b52dd5555e89c Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 9 Aug 2021 13:26:45 +0200 Subject: [PATCH] Kernel/SMP: Process the deferred call queue in exit_trap() We were previously relying on a side effect of the critical section in smp_process_pending_messages(): when exiting that section, it would process any pending deferred calls. Instead of relying on that, make the deferred invocations explicit by calling deferred_call_execute_pending() in exit_trap(). This ensures that deferred calls get processed before entering the scheduler at the end of exit_trap(). Since thread unblocking happens via deferred calls, the threads don't have to wait until the next scheduling opportunity when they could be ready *now*. :^) This was the main reason Tom's SMP branch ran slowly in non-SMP mode. --- Kernel/Arch/x86/common/Processor.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Kernel/Arch/x86/common/Processor.cpp b/Kernel/Arch/x86/common/Processor.cpp index e4c94735de..d1e7c69def 100644 --- a/Kernel/Arch/x86/common/Processor.cpp +++ b/Kernel/Arch/x86/common/Processor.cpp @@ -616,6 +616,10 @@ void Processor::exit_trap(TrapFrame& trap) if (s_smp_enabled) smp_process_pending_messages(); + // Process the deferred call queue. Among other things, this ensures + // that any pending thread unblocks happen before we enter the scheduler. + deferred_call_execute_pending(); + auto* current_thread = Processor::current_thread(); if (current_thread) { auto& current_trap = current_thread->current_trap();