From 7faa5e2fcf41c4fbb2241b605e8f2a11738fc4d9 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 24 Apr 2025 15:52:36 +0200 Subject: dev, kernel: scheduler, timer: hw timer and scheduler improvements. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'dev/kernel/HALKit/AMD64/HalKernelMain.cc') diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index d59e9e86..0c680f97 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -19,8 +19,6 @@ EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; -STATIC Kernel::Array kTeams; - STATIC Kernel::Void hal_pre_init_scheduler() noexcept { for (Kernel::SizeT i = 0U; i < Kernel::UserProcessScheduler::The().CurrentTeam().AsArray().Count(); ++i) @@ -98,11 +96,13 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept idt_loader.Load(idt_reg); - /// after the scheduler runs, we must look over teams, every 200ms in order to schedule every process according to their affinity fairly. + /// after the scheduler runs, we must look over teams, every 5000s in order to schedule every process according to their affinity fairly. + + auto constexpr kSchedTeamSwitchMS = 5U; /// @brief Team switch time in milliseconds. - auto constexpr kSchedTeamSwitchMS = 200U; /// @brief Team switch time in milliseconds. + Kernel::HardwareTimer timer(rtl_milliseconds(kSchedTeamSwitchMS)); - Kernel::HardwareTimer timer(rtl_ms(kSchedTeamSwitchMS)); + STATIC Kernel::Array kTeams; SizeT team_index = 0U; @@ -110,15 +110,16 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept /// @details Not even round-robin, just a simple loop in this boot core we're at. while (YES) { - timer.Wait(); - - UserProcessScheduler::The().SwitchTeam(kTeams[team_index]); - - ++team_index; - - if (team_index > kSchedTeamCount) + if (team_index > (kSchedTeamCount - 1)) { team_index = 0U; } + + while (!UserProcessScheduler::The().SwitchTeam(kTeams[team_index])) + ; + + timer.Wait(); + + ++team_index; } } -- cgit v1.2.3