From 9084d9305cd038f27f14fd564ccad1514f261409 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 7 Apr 2026 03:59:08 +0300 Subject: [PATCH] Kernel: Change preemption condition Instead of keeping track of the current time and rescheduling when interval has passed, keep track of the next expected reschedule time. This prevents theoretically missing every second pre-emption when scheduler's timer is interrupting at same rate as the interval. --- kernel/include/kernel/Scheduler.h | 2 +- kernel/kernel/Scheduler.cpp | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/kernel/include/kernel/Scheduler.h b/kernel/include/kernel/Scheduler.h index 5b91a648..affd62f3 100644 --- a/kernel/include/kernel/Scheduler.h +++ b/kernel/include/kernel/Scheduler.h @@ -101,7 +101,7 @@ namespace Kernel InterruptStack* m_interrupt_stack { nullptr }; InterruptRegisters* m_interrupt_registers { nullptr }; - uint64_t m_last_reschedule_ns { 0 }; + uint64_t m_next_reschedule_ns { 0 }; uint64_t m_last_load_balance_ns { 0 }; struct ThreadInfo diff --git a/kernel/kernel/Scheduler.cpp b/kernel/kernel/Scheduler.cpp index 0decdfde..e0598cb2 100644 --- a/kernel/kernel/Scheduler.cpp +++ b/kernel/kernel/Scheduler.cpp @@ -139,6 +139,8 @@ namespace Kernel if (Processor::count() > 1) Processor::set_smp_enabled(); + m_next_reschedule_ns = SystemTimer::get().ns_since_boot(); + return {}; } @@ -348,13 +350,10 @@ namespace Kernel wake_up_sleeping_threads(); + if (SystemTimer::get().ns_since_boot() >= m_next_reschedule_ns) { - const uint64_t current_ns = SystemTimer::get().ns_since_boot(); - if (current_ns >= m_last_reschedule_ns + s_reschedule_interval_ns) - { - m_last_reschedule_ns = current_ns; - Processor::yield(); - } + m_next_reschedule_ns += s_reschedule_interval_ns; + Processor::yield(); } }