From e632208b7983551c2e62a71ed725c217546058b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 10 Sep 2020 22:29:11 +0200 Subject: [PATCH] kernel/scheduler: enable cpu load tracking after boot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit when the cpufreq module is loaded, we let the scheduler update its policy. Improve assert report CoreEntry::GetLoad() could return more than kMaxLoad. Change-Id: I127f9b3e8062b5996872aae30b4021b9904fa179 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3216 Reviewed-by: Jérôme Duval --- headers/private/kernel/kscheduler.h | 1 + src/system/kernel/cpu.cpp | 2 ++ src/system/kernel/scheduler/scheduler.cpp | 19 +++++++++++++------ src/system/kernel/scheduler/scheduler_cpu.cpp | 4 +++- src/system/kernel/scheduler/scheduler_cpu.h | 2 +- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/headers/private/kernel/kscheduler.h b/headers/private/kernel/kscheduler.h index bfc6e0203d..15072f4c9d 100644 --- a/headers/private/kernel/kscheduler.h +++ b/headers/private/kernel/kscheduler.h @@ -86,6 +86,7 @@ void scheduler_remove_listener(struct SchedulerListener* listener); void scheduler_init(void); void scheduler_enable_scheduling(void); +void scheduler_update_policy(void); bigtime_t _user_estimate_max_scheduling_latency(thread_id thread); status_t _user_analyze_scheduling(bigtime_t from, bigtime_t until, void* buffer, diff --git a/src/system/kernel/cpu.cpp b/src/system/kernel/cpu.cpp index b4cdad7f5e..64932dae81 100644 --- a/src/system/kernel/cpu.cpp +++ b/src/system/kernel/cpu.cpp @@ -89,6 +89,8 @@ load_cpufreq_module() if (sCPUPerformanceModule == NULL) dprintf("no valid cpufreq module found\n"); + else + scheduler_update_policy(); } diff --git a/src/system/kernel/scheduler/scheduler.cpp b/src/system/kernel/scheduler/scheduler.cpp index f7fca91256..4d2df07765 100644 --- a/src/system/kernel/scheduler/scheduler.cpp +++ b/src/system/kernel/scheduler/scheduler.cpp @@ -654,12 +654,7 @@ init() // disable parts of the scheduler logic that are not needed gSingleCore = coreCount == 1; - gTrackCPULoad = increase_cpu_performance(0) == B_OK; - gTrackCoreLoad = !gSingleCore || gTrackCPULoad; - dprintf("scheduler switches: single core: %s, cpu load tracking: %s," - " core load tracking: %s\n", gSingleCore ? "true" : "false", - gTrackCPULoad ? "true" : "false", - gTrackCoreLoad ? "true" : "false"); + scheduler_update_policy(); gCoreCount = coreCount; gPackageCount = packageCount; @@ -740,6 +735,18 @@ scheduler_enable_scheduling() } +void +scheduler_update_policy() +{ + gTrackCPULoad = increase_cpu_performance(0) == B_OK; + gTrackCoreLoad = !gSingleCore || gTrackCPULoad; + dprintf("scheduler switches: single core: %s, cpu load tracking: %s," + " core load tracking: %s\n", gSingleCore ? "true" : "false", + gTrackCPULoad ? "true" : "false", + gTrackCoreLoad ? "true" : "false"); +} + + // #pragma mark - SchedulerListener diff --git a/src/system/kernel/scheduler/scheduler_cpu.cpp b/src/system/kernel/scheduler/scheduler_cpu.cpp index fa2688be35..6b33db2162 100644 --- a/src/system/kernel/scheduler/scheduler_cpu.cpp +++ b/src/system/kernel/scheduler/scheduler_cpu.cpp @@ -326,7 +326,9 @@ CPUEntry::_RequestPerformanceLevel(ThreadData* threadData) } int32 load = std::max(threadData->GetLoad(), fCore->GetLoad()); - ASSERT(load >= 0 && load <= kMaxLoad); + ASSERT_PRINT(load >= 0 && load <= kMaxLoad, "load is out of range %" + B_PRId32 " (max of %" B_PRId32 " %" B_PRId32 ")", load, + threadData->GetLoad(), fCore->GetLoad()); if (load < kTargetLoad) { int32 delta = kTargetLoad - load; diff --git a/src/system/kernel/scheduler/scheduler_cpu.h b/src/system/kernel/scheduler/scheduler_cpu.h index 9b5ef79027..af949b53a6 100644 --- a/src/system/kernel/scheduler/scheduler_cpu.h +++ b/src/system/kernel/scheduler/scheduler_cpu.h @@ -397,7 +397,7 @@ CoreEntry::GetLoad() const SCHEDULER_ENTER_FUNCTION(); ASSERT(fCPUCount > 0); - return fLoad / fCPUCount; + return std::min(fLoad / fCPUCount, kMaxLoad); }