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(); } }