From e4ea637227d7cf9a53bc89317990b8a22a76780a Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Fri, 3 Jan 2014 19:34:25 +0100 Subject: [PATCH] scheduler: Disable load tracking when not needed --- src/system/kernel/scheduler/scheduler.cpp | 13 +++++++++++-- src/system/kernel/scheduler/scheduler_common.h | 2 ++ src/system/kernel/scheduler/scheduler_cpu.cpp | 6 ++++-- .../kernel/scheduler/scheduler_thread.cpp | 18 ++++++++++++++++++ src/system/kernel/scheduler/scheduler_thread.h | 17 +---------------- 5 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/system/kernel/scheduler/scheduler.cpp b/src/system/kernel/scheduler/scheduler.cpp index 41546f05da..bb3caa8034 100644 --- a/src/system/kernel/scheduler/scheduler.cpp +++ b/src/system/kernel/scheduler/scheduler.cpp @@ -136,6 +136,8 @@ scheduler_mode gCurrentModeID; scheduler_mode_operations* gCurrentMode; bool gSingleCore; +bool gCPUFrequencyManagement; +bool gTrackLoad; CPUEntry* gCPUEntries; @@ -533,7 +535,6 @@ reschedule(int32 nextState) Thread* nextThread = nextThreadData->GetThread(); ASSERT(!gCPU[thisCPU].disabled || thread_is_idle_thread(nextThread)); - // update CPU heap CoreCPUHeapLocker cpuLocker(core); cpu->UpdatePriority(nextThreadData->GetEffectivePriority()); @@ -803,8 +804,16 @@ init() if (result != B_OK) return result; - gCoreCount = coreCount; + // disable parts of the scheduler logic that are not needed gSingleCore = coreCount == 1; + gCPUFrequencyManagement = increase_cpu_performance(0) == B_OK; + gTrackLoad = !gSingleCore || gCPUFrequencyManagement; + dprintf("scheduler switches: single core: %s, cpufreq: %s, load tracking:" + " %s\n", gSingleCore ? "true" : "false", + gCPUFrequencyManagement ? "true" : "false", + gTrackLoad ? "true" : "false"); + + gCoreCount = coreCount; gPackageCount = packageCount; gCPUEntries = new(std::nothrow) CPUEntry[cpuCount]; diff --git a/src/system/kernel/scheduler/scheduler_common.h b/src/system/kernel/scheduler/scheduler_common.h index 02c96917f2..812fb7d8d0 100644 --- a/src/system/kernel/scheduler/scheduler_common.h +++ b/src/system/kernel/scheduler/scheduler_common.h @@ -43,6 +43,8 @@ const int kVeryHighLoad = (kMaxLoad + kHighLoad) / 2; const int kLoadDifference = kMaxLoad * 20 / 100; extern bool gSingleCore; +extern bool gCPUFrequencyManagement; +extern bool gTrackLoad; void init_debug_commands(); diff --git a/src/system/kernel/scheduler/scheduler_cpu.cpp b/src/system/kernel/scheduler/scheduler_cpu.cpp index 08987fd49a..a88c041693 100644 --- a/src/system/kernel/scheduler/scheduler_cpu.cpp +++ b/src/system/kernel/scheduler/scheduler_cpu.cpp @@ -164,7 +164,6 @@ CPUEntry::ComputeLoad() { SCHEDULER_ENTER_FUNCTION(); - ASSERT(!gSingleCore); ASSERT(fCPUNumber == smp_get_current_cpu()); int oldLoad = compute_load(fMeasureTime, fMeasureActiveTime, fLoad); @@ -247,7 +246,7 @@ CPUEntry::TrackActivity(ThreadData* oldThreadData, ThreadData* nextThreadData) oldThreadData->ComputeLoad(); nextThreadData->ComputeLoad(); - if (!gSingleCore && !cpuEntry->disabled) + if (gTrackLoad && !cpuEntry->disabled) ComputeLoad(); Thread* nextThread = nextThreadData->GetThread(); @@ -267,6 +266,9 @@ CPUEntry::_RequestPerformanceLevel(ThreadData* threadData) { SCHEDULER_ENTER_FUNCTION(); + if (!gCPUFrequencyManagement) + return; + if (gCPU[fCPUNumber].disabled) { decrease_cpu_performance(kCPUPerformanceScaleMax); return; diff --git a/src/system/kernel/scheduler/scheduler_thread.cpp b/src/system/kernel/scheduler/scheduler_thread.cpp index 4d5ea1909b..ec84ee46ec 100644 --- a/src/system/kernel/scheduler/scheduler_thread.cpp +++ b/src/system/kernel/scheduler/scheduler_thread.cpp @@ -115,6 +115,24 @@ ThreadData::ChooseCoreAndCPU(CoreEntry*& targetCore, CPUEntry*& targetCPU) } +void +ThreadData::ComputeLoad() +{ + SCHEDULER_ENTER_FUNCTION(); + + if (!gTrackLoad) + return; + + if (fLastInterruptTime > 0) { + bigtime_t interruptTime = gCPU[smp_get_current_cpu()].interrupt_time; + interruptTime -= fLastInterruptTime; + fMeasureActiveTime -= interruptTime; + } + + compute_load(fMeasureTime, fMeasureActiveTime, fLoad); +} + + bigtime_t ThreadData::ComputeQuantum() { diff --git a/src/system/kernel/scheduler/scheduler_thread.h b/src/system/kernel/scheduler/scheduler_thread.h index 98cc660cc6..debcf2d98b 100644 --- a/src/system/kernel/scheduler/scheduler_thread.h +++ b/src/system/kernel/scheduler/scheduler_thread.h @@ -56,7 +56,7 @@ public: inline bool Dequeue(); inline void UpdateActivity(bigtime_t active); - inline void ComputeLoad(); + void ComputeLoad(); inline bool HasQuantumEnded(bool wasPreempted, bool hasYielded); bigtime_t ComputeQuantum(); @@ -318,21 +318,6 @@ ThreadData::UpdateActivity(bigtime_t active) } -inline void -ThreadData::ComputeLoad() -{ - SCHEDULER_ENTER_FUNCTION(); - - if (fLastInterruptTime > 0) { - bigtime_t interruptTime = gCPU[smp_get_current_cpu()].interrupt_time; - interruptTime -= fLastInterruptTime; - fMeasureActiveTime -= interruptTime; - } - - compute_load(fMeasureTime, fMeasureActiveTime, fLoad); -} - - inline bool ThreadData::HasQuantumEnded(bool wasPreempted, bool hasYielded) {