scheduler: Disable load tracking when not needed
This commit is contained in:
@@ -136,6 +136,8 @@ scheduler_mode gCurrentModeID;
|
|||||||
scheduler_mode_operations* gCurrentMode;
|
scheduler_mode_operations* gCurrentMode;
|
||||||
|
|
||||||
bool gSingleCore;
|
bool gSingleCore;
|
||||||
|
bool gCPUFrequencyManagement;
|
||||||
|
bool gTrackLoad;
|
||||||
|
|
||||||
CPUEntry* gCPUEntries;
|
CPUEntry* gCPUEntries;
|
||||||
|
|
||||||
@@ -533,7 +535,6 @@ reschedule(int32 nextState)
|
|||||||
|
|
||||||
Thread* nextThread = nextThreadData->GetThread();
|
Thread* nextThread = nextThreadData->GetThread();
|
||||||
ASSERT(!gCPU[thisCPU].disabled || thread_is_idle_thread(nextThread));
|
ASSERT(!gCPU[thisCPU].disabled || thread_is_idle_thread(nextThread));
|
||||||
|
|
||||||
// update CPU heap
|
// update CPU heap
|
||||||
CoreCPUHeapLocker cpuLocker(core);
|
CoreCPUHeapLocker cpuLocker(core);
|
||||||
cpu->UpdatePriority(nextThreadData->GetEffectivePriority());
|
cpu->UpdatePriority(nextThreadData->GetEffectivePriority());
|
||||||
@@ -803,8 +804,16 @@ init()
|
|||||||
if (result != B_OK)
|
if (result != B_OK)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
gCoreCount = coreCount;
|
// disable parts of the scheduler logic that are not needed
|
||||||
gSingleCore = coreCount == 1;
|
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;
|
gPackageCount = packageCount;
|
||||||
|
|
||||||
gCPUEntries = new(std::nothrow) CPUEntry[cpuCount];
|
gCPUEntries = new(std::nothrow) CPUEntry[cpuCount];
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ const int kVeryHighLoad = (kMaxLoad + kHighLoad) / 2;
|
|||||||
const int kLoadDifference = kMaxLoad * 20 / 100;
|
const int kLoadDifference = kMaxLoad * 20 / 100;
|
||||||
|
|
||||||
extern bool gSingleCore;
|
extern bool gSingleCore;
|
||||||
|
extern bool gCPUFrequencyManagement;
|
||||||
|
extern bool gTrackLoad;
|
||||||
|
|
||||||
|
|
||||||
void init_debug_commands();
|
void init_debug_commands();
|
||||||
|
|||||||
@@ -164,7 +164,6 @@ CPUEntry::ComputeLoad()
|
|||||||
{
|
{
|
||||||
SCHEDULER_ENTER_FUNCTION();
|
SCHEDULER_ENTER_FUNCTION();
|
||||||
|
|
||||||
ASSERT(!gSingleCore);
|
|
||||||
ASSERT(fCPUNumber == smp_get_current_cpu());
|
ASSERT(fCPUNumber == smp_get_current_cpu());
|
||||||
|
|
||||||
int oldLoad = compute_load(fMeasureTime, fMeasureActiveTime, fLoad);
|
int oldLoad = compute_load(fMeasureTime, fMeasureActiveTime, fLoad);
|
||||||
@@ -247,7 +246,7 @@ CPUEntry::TrackActivity(ThreadData* oldThreadData, ThreadData* nextThreadData)
|
|||||||
|
|
||||||
oldThreadData->ComputeLoad();
|
oldThreadData->ComputeLoad();
|
||||||
nextThreadData->ComputeLoad();
|
nextThreadData->ComputeLoad();
|
||||||
if (!gSingleCore && !cpuEntry->disabled)
|
if (gTrackLoad && !cpuEntry->disabled)
|
||||||
ComputeLoad();
|
ComputeLoad();
|
||||||
|
|
||||||
Thread* nextThread = nextThreadData->GetThread();
|
Thread* nextThread = nextThreadData->GetThread();
|
||||||
@@ -267,6 +266,9 @@ CPUEntry::_RequestPerformanceLevel(ThreadData* threadData)
|
|||||||
{
|
{
|
||||||
SCHEDULER_ENTER_FUNCTION();
|
SCHEDULER_ENTER_FUNCTION();
|
||||||
|
|
||||||
|
if (!gCPUFrequencyManagement)
|
||||||
|
return;
|
||||||
|
|
||||||
if (gCPU[fCPUNumber].disabled) {
|
if (gCPU[fCPUNumber].disabled) {
|
||||||
decrease_cpu_performance(kCPUPerformanceScaleMax);
|
decrease_cpu_performance(kCPUPerformanceScaleMax);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -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
|
bigtime_t
|
||||||
ThreadData::ComputeQuantum()
|
ThreadData::ComputeQuantum()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public:
|
|||||||
inline bool Dequeue();
|
inline bool Dequeue();
|
||||||
|
|
||||||
inline void UpdateActivity(bigtime_t active);
|
inline void UpdateActivity(bigtime_t active);
|
||||||
inline void ComputeLoad();
|
void ComputeLoad();
|
||||||
|
|
||||||
inline bool HasQuantumEnded(bool wasPreempted, bool hasYielded);
|
inline bool HasQuantumEnded(bool wasPreempted, bool hasYielded);
|
||||||
bigtime_t ComputeQuantum();
|
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
|
inline bool
|
||||||
ThreadData::HasQuantumEnded(bool wasPreempted, bool hasYielded)
|
ThreadData::HasQuantumEnded(bool wasPreempted, bool hasYielded)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user