Kernel: Cleanup scheduling while idling

If there are no threads in the run queue and we are idle, attempt to
wake up threads from the sleep queue
This commit is contained in:
Bananymous 2025-12-30 16:15:09 +02:00
parent b0bd4ad546
commit 31a1968798
2 changed files with 28 additions and 16 deletions

View File

@ -82,6 +82,8 @@ namespace Kernel
void update_most_loaded_node_queue(SchedulerQueue::Node*, SchedulerQueue* target_queue);
void remove_node_from_most_loaded(SchedulerQueue::Node*);
void wake_up_sleeping_threads();
void do_load_balancing();
class ProcessorID find_least_loaded_processor() const;

View File

@ -290,10 +290,34 @@ namespace Kernel
m_current->last_start_ns = SystemTimer::get().ns_since_boot();
}
void Scheduler::wake_up_sleeping_threads()
{
const uint64_t current_ns = SystemTimer::get().ns_since_boot();
while (!m_block_queue.empty() && current_ns >= m_block_queue.front()->wake_time_ns)
{
auto* node = m_block_queue.pop_front();
{
SpinLockGuard _(node->blocker_lock);
if (node->blocker)
node->blocker->remove_blocked_thread(node);
}
node->blocked = false;
update_most_loaded_node_queue(node, &m_run_queue);
m_run_queue.add_thread_to_back(node);
}
}
void Scheduler::reschedule_if_idle()
{
ASSERT(Processor::get_interrupt_state() == InterruptState::Disabled);
if (!m_current && !m_run_queue.empty())
if (m_current != nullptr)
return;
if (m_run_queue.empty())
wake_up_sleeping_threads();
if (!m_run_queue.empty())
Processor::yield();
}
@ -304,21 +328,7 @@ namespace Kernel
if (Processor::is_smp_enabled())
do_load_balancing();
{
const uint64_t current_ns = SystemTimer::get().ns_since_boot();
while (!m_block_queue.empty() && current_ns >= m_block_queue.front()->wake_time_ns)
{
auto* node = m_block_queue.pop_front();
{
SpinLockGuard _(node->blocker_lock);
if (node->blocker)
node->blocker->remove_blocked_thread(node);
}
node->blocked = false;
update_most_loaded_node_queue(node, &m_run_queue);
m_run_queue.add_thread_to_back(node);
}
}
wake_up_sleeping_threads();
{
const uint64_t current_ns = SystemTimer::get().ns_since_boot();