From 3dce49af0ecc67f243fdd37fbcfa3321f7d2047b Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Fri, 17 Jan 2014 01:43:41 +0100 Subject: [PATCH] scheduler: Cache quantum length --- .../kernel/scheduler/scheduler_thread.cpp | 36 ++++++++++--------- .../kernel/scheduler/scheduler_thread.h | 3 +- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/system/kernel/scheduler/scheduler_thread.cpp b/src/system/kernel/scheduler/scheduler_thread.cpp index 29d3ae2975..8651c5cacc 100644 --- a/src/system/kernel/scheduler/scheduler_thread.cpp +++ b/src/system/kernel/scheduler/scheduler_thread.cpp @@ -11,6 +11,9 @@ using namespace Scheduler; static bigtime_t sQuantumLengths[THREAD_MAX_SET_PRIORITY + 1]; +const int32 kMaximumQuantumLengthsCount = 20; +static bigtime_t sMaximumQuantumLengths[kMaximumQuantumLengthsCount]; + void ThreadData::_InitBase() @@ -18,6 +21,7 @@ ThreadData::_InitBase() fPriorityPenalty = 0; fAdditionalPenalty = 0; fEffectivePriority = GetPriority(); + fBaseQuantum = sQuantumLengths[GetEffectivePriority()]; fCPUBound = false; fTimeUsed = 0; @@ -83,15 +87,6 @@ ThreadData::_ChooseCPU(CoreEntry* core, bool& rescheduleNeeded) const } -inline bigtime_t -ThreadData::_GetBaseQuantum() const -{ - SCHEDULER_ENTER_FUNCTION(); - - return sQuantumLengths[GetEffectivePriority()]; -} - - ThreadData::ThreadData(Thread* thread) : fThread(thread) @@ -190,19 +185,16 @@ ThreadData::ComputeQuantum() const { SCHEDULER_ENTER_FUNCTION(); - bigtime_t quantum = _GetBaseQuantum(); if (IsRealTime()) - return quantum; + return fBaseQuantum; int32 threadCount = fCore->ThreadCount(); if (fCore->CPUCount() > 0) threadCount /= fCore->CPUCount(); - if (threadCount >= 1) { - quantum - = std::min(gCurrentMode->maximum_latency / threadCount, quantum); - quantum = std::max(quantum, gCurrentMode->minimal_quantum); - } + bigtime_t quantum = fBaseQuantum; + if (threadCount < kMaximumQuantumLengthsCount) + quantum = std::min(sMaximumQuantumLengths[threadCount], quantum); return quantum; } @@ -232,6 +224,16 @@ ThreadData::ComputeQuantumLengths() sQuantumLengths[priority] = _ScaleQuantum(kQuantum2, kQuantum1, B_NORMAL_PRIORITY, B_IDLE_PRIORITY, priority); } + + for (int32 threadCount = 0; threadCount < kMaximumQuantumLengthsCount; + threadCount++) { + + bigtime_t quantum = gCurrentMode->maximum_latency; + if (threadCount != 0) + quantum /= threadCount; + quantum = std::max(quantum, gCurrentMode->minimal_quantum); + sMaximumQuantumLengths[threadCount] = quantum; + } } @@ -276,6 +278,8 @@ ThreadData::_ComputeEffectivePriority() const ASSERT(fEffectivePriority < B_FIRST_REAL_TIME_PRIORITY); ASSERT(fEffectivePriority >= B_LOWEST_ACTIVE_PRIORITY); } + + fBaseQuantum = sQuantumLengths[GetEffectivePriority()]; } diff --git a/src/system/kernel/scheduler/scheduler_thread.h b/src/system/kernel/scheduler/scheduler_thread.h index bfcaa59e77..980d6c2fff 100644 --- a/src/system/kernel/scheduler/scheduler_thread.h +++ b/src/system/kernel/scheduler/scheduler_thread.h @@ -29,8 +29,6 @@ private: inline CPUEntry* _ChooseCPU(CoreEntry* core, bool& rescheduleNeeded) const; - inline bigtime_t _GetBaseQuantum() const; - public: ThreadData(Thread* thread); @@ -121,6 +119,7 @@ private: int32 fAdditionalPenalty; mutable int32 fEffectivePriority; + mutable bigtime_t fBaseQuantum; bigtime_t fTimeUsed;