Browse Source

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.
Andreas Kling 3 năm trước cách đây
mục cha
commit
a971de89d3
1 tập tin đã thay đổi với 4 bổ sung0 xóa
  1. 4 0
      Kernel/Arch/x86/common/Processor.cpp

+ 4 - 0
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();