Kernel: Make m_halt_requested an atomic variable

We need to make sure the change to this variable is visible to all
processors instantly.
This commit is contained in:
Tom 2020-10-27 20:39:08 -06:00 committed by Andreas Kling
parent a14884dd33
commit e26e0445b5
Notes: sideshowbarker 2024-07-19 01:27:01 +09:00
2 changed files with 5 additions and 5 deletions

View file

@ -1819,11 +1819,11 @@ bool Processor::smp_process_pending_messages()
} }
} }
if (m_halt_requested) if (m_halt_requested.load(AK::MemoryOrder::memory_order_relaxed))
halt_this(); halt_this();
} }
did_process = true; did_process = true;
} else if (m_halt_requested) { } else if (m_halt_requested.load(AK::MemoryOrder::memory_order_relaxed)) {
halt_this(); halt_this();
} }
@ -1876,7 +1876,7 @@ void Processor::smp_broadcast_message(ProcessorMessage& msg, bool async)
// We need to check here if another processor may have requested // We need to check here if another processor may have requested
// us to halt before this message could be delivered. Otherwise // us to halt before this message could be delivered. Otherwise
// we're just spinning the CPU because msg.refs will never drop to 0. // we're just spinning the CPU because msg.refs will never drop to 0.
if (cur_proc.m_halt_requested) if (cur_proc.m_halt_requested.load(AK::MemoryOrder::memory_order_relaxed))
halt_this(); halt_this();
} }
@ -1918,7 +1918,7 @@ void Processor::smp_broadcast_halt()
// by being out of memory and we might not be able to get a message // by being out of memory and we might not be able to get a message
for_each( for_each(
[&](Processor& proc) -> IterationDecision { [&](Processor& proc) -> IterationDecision {
proc.m_halt_requested = true; proc.m_halt_requested.store(true, AK::MemoryOrder::memory_order_release);
return IterationDecision::Continue; return IterationDecision::Continue;
}); });

View file

@ -724,7 +724,7 @@ class Processor {
bool m_invoke_scheduler_async; bool m_invoke_scheduler_async;
bool m_scheduler_initialized; bool m_scheduler_initialized;
bool m_halt_requested; Atomic<bool> m_halt_requested;
DeferredCallEntry* m_pending_deferred_calls; // in reverse order DeferredCallEntry* m_pending_deferred_calls; // in reverse order
DeferredCallEntry* m_free_deferred_call_pool_entry; DeferredCallEntry* m_free_deferred_call_pool_entry;