diff --git a/src/system/kernel/scheduler/scheduler.cpp b/src/system/kernel/scheduler/scheduler.cpp index 87bfc789f8..567e8a5636 100644 --- a/src/system/kernel/scheduler/scheduler.cpp +++ b/src/system/kernel/scheduler/scheduler.cpp @@ -579,10 +579,9 @@ reschedule(int32 nextState) bigtime_t quantum = nextThreadData->ComputeQuantum(); add_timer(quantumTimer, &reschedule_event, quantum, B_ONE_SHOT_RELATIVE_TIMER); - } else { - nextThreadData->StartQuantum(); + } else gCurrentMode->rebalance_irqs(true); - } + nextThreadData->StartQuantum(); modeLocker.Unlock(); if (nextThread != oldThread) @@ -674,6 +673,8 @@ scheduler_set_operation_mode(scheduler_mode mode) gCurrentMode = sSchedulerModes[mode]; gCurrentMode->switch_to_mode(); + ThreadData::ComputeQuantumLengths(); + return B_OK; } diff --git a/src/system/kernel/scheduler/scheduler_thread.cpp b/src/system/kernel/scheduler/scheduler_thread.cpp index ab45e78de0..70f540a94b 100644 --- a/src/system/kernel/scheduler/scheduler_thread.cpp +++ b/src/system/kernel/scheduler/scheduler_thread.cpp @@ -9,6 +9,9 @@ using namespace Scheduler; +bigtime_t Scheduler::gQuantumLengths[THREAD_MAX_SET_PRIORITY + 1]; + + ThreadData::ThreadData(Thread* thread) : fThread(thread) @@ -116,12 +119,37 @@ ThreadData::ComputeQuantum() quantum = std::max(quantum, gCurrentMode->minimal_quantum); fTimeLeft = quantum; - fQuantumStart = system_time(); return quantum; } +/* static */ void +ThreadData::ComputeQuantumLengths() +{ + for (int32 priority = 0; priority <= THREAD_MAX_SET_PRIORITY; priority++) { + const bigtime_t kQuantum0 = gCurrentMode->base_quantum; + if (priority >= B_URGENT_DISPLAY_PRIORITY) { + gQuantumLengths[priority] = kQuantum0; + continue; + } + + const bigtime_t kQuantum1 + = kQuantum0 * gCurrentMode->quantum_multipliers[0]; + if (priority > B_NORMAL_PRIORITY) { + gQuantumLengths[priority] = _ScaleQuantum(kQuantum1, kQuantum0, + B_URGENT_DISPLAY_PRIORITY, B_NORMAL_PRIORITY, priority); + continue; + } + + const bigtime_t kQuantum2 + = kQuantum0 * gCurrentMode->quantum_multipliers[1]; + gQuantumLengths[priority] = _ScaleQuantum(kQuantum2, kQuantum1, + B_NORMAL_PRIORITY, B_IDLE_PRIORITY, priority); + } +} + + void ThreadData::_ComputeEffectivePriority() const { @@ -181,23 +209,7 @@ ThreadData::_ChooseCPU(CoreEntry* core, bool& rescheduleNeeded) const inline bigtime_t ThreadData::_GetBaseQuantum() const { - int32 priority = GetEffectivePriority(); - - const bigtime_t kQuantum0 = gCurrentMode->base_quantum; - if (priority >= B_URGENT_DISPLAY_PRIORITY) - return kQuantum0; - - const bigtime_t kQuantum1 - = kQuantum0 * gCurrentMode->quantum_multipliers[0]; - if (priority > B_NORMAL_PRIORITY) { - return _ScaleQuantum(kQuantum1, kQuantum0, B_URGENT_DISPLAY_PRIORITY, - B_NORMAL_PRIORITY, priority); - } - - const bigtime_t kQuantum2 - = kQuantum0 * gCurrentMode->quantum_multipliers[1]; - return _ScaleQuantum(kQuantum2, kQuantum1, B_NORMAL_PRIORITY, - B_IDLE_PRIORITY, priority); + return gQuantumLengths[GetEffectivePriority()]; } diff --git a/src/system/kernel/scheduler/scheduler_thread.h b/src/system/kernel/scheduler/scheduler_thread.h index 4260e82586..7500bcbc7d 100644 --- a/src/system/kernel/scheduler/scheduler_thread.h +++ b/src/system/kernel/scheduler/scheduler_thread.h @@ -70,6 +70,7 @@ public: inline CoreEntry* Core() const { return fCore; } inline void UnassignCore() { fCore = NULL; } + static void ComputeQuantumLengths(); private: inline int32 _GetPenalty() const; inline int32 _GetMinimalPriority() const; @@ -118,6 +119,8 @@ public: virtual void operator()(ThreadData* thread) = 0; }; +extern bigtime_t gQuantumLengths[THREAD_MAX_SET_PRIORITY + 1]; + inline bool ThreadData::HasCacheExpired() const