From c2a02dee65184026ea953726a9ab1bac1c0a4617 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Tue, 7 Jan 2014 02:09:29 +0100 Subject: [PATCH] kernel: Relax cpu_ent::interrupt_time locking The value isn't accessed by the other CPUs and all writes and reads are done with interrupts disabled. --- src/system/kernel/int.cpp | 10 ++++++---- src/system/kernel/scheduler/scheduler.cpp | 3 +-- src/system/kernel/scheduler/scheduler_thread.cpp | 7 ------- src/system/kernel/scheduler/scheduler_thread.h | 12 ++++++------ 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/system/kernel/int.cpp b/src/system/kernel/int.cpp index fea008b845..c09d8bc6c3 100644 --- a/src/system/kernel/int.cpp +++ b/src/system/kernel/int.cpp @@ -359,14 +359,16 @@ int_io_interrupt_handler(int vector, bool levelTriggered) if (!sVectors[vector].no_lock_vector) release_spinlock(&sVectors[vector].vector_lock); - SpinLocker locker(sVectors[vector].load_lock); + SpinLocker vectorLocker(sVectors[vector].load_lock); bigtime_t deltaTime = system_time() - start; sVectors[vector].last_measure_active += deltaTime; - locker.Unlock(); + vectorLocker.Unlock(); - atomic_add64(&get_cpu_struct()->interrupt_time, deltaTime); + cpu_ent* cpu = get_cpu_struct(); + cpu->interrupt_time += deltaTime; if (sVectors[vector].type == INTERRUPT_TYPE_IRQ) - atomic_add64(&get_cpu_struct()->irq_time, deltaTime); + cpu->irq_time += deltaTime; + update_int_load(vector); if (levelTriggered) diff --git a/src/system/kernel/scheduler/scheduler.cpp b/src/system/kernel/scheduler/scheduler.cpp index ca67208868..ca04585c92 100644 --- a/src/system/kernel/scheduler/scheduler.cpp +++ b/src/system/kernel/scheduler/scheduler.cpp @@ -393,8 +393,7 @@ reschedule(int32 nextState) ThreadData* oldThreadData = oldThread->scheduler_data; // return time spent in interrupts - oldThreadData->IncreaseStolenTime( - gCPU[thisCPU].interrupt_time - oldThreadData->LastInterruptTime()); + oldThreadData->SetStolenInterruptTime(gCPU[thisCPU].interrupt_time); bool enqueueOldThread = false; bool putOldThreadAtBack = false; diff --git a/src/system/kernel/scheduler/scheduler_thread.cpp b/src/system/kernel/scheduler/scheduler_thread.cpp index 6f9c818dad..af4b40aa1e 100644 --- a/src/system/kernel/scheduler/scheduler_thread.cpp +++ b/src/system/kernel/scheduler/scheduler_thread.cpp @@ -166,13 +166,6 @@ ThreadData::ComputeLoad() SCHEDULER_ENTER_FUNCTION(); ASSERT(gTrackLoad); - - if (fLastInterruptTime > 0) { - bigtime_t interruptTime = gCPU[smp_get_current_cpu()].interrupt_time; - interruptTime -= fLastInterruptTime; - fMeasureActiveTime -= interruptTime; - } - compute_load(fMeasureTime, fMeasureActiveTime, fLoad); } diff --git a/src/system/kernel/scheduler/scheduler_thread.h b/src/system/kernel/scheduler/scheduler_thread.h index 8d9cbdda2d..5c8d052120 100644 --- a/src/system/kernel/scheduler/scheduler_thread.h +++ b/src/system/kernel/scheduler/scheduler_thread.h @@ -51,12 +51,9 @@ public: bool ChooseCoreAndCPU(CoreEntry*& targetCore, CPUEntry*& targetCPU); - inline bigtime_t LastInterruptTime() const - { return fLastInterruptTime; } inline void SetLastInterruptTime(bigtime_t interruptTime) { fLastInterruptTime = interruptTime; } - - inline void IncreaseStolenTime(bigtime_t stolenTime); + inline void SetStolenInterruptTime(bigtime_t interruptTime); inline void GoesAway(); inline bigtime_t WentSleep() const { return fWentSleep; } @@ -226,10 +223,13 @@ ThreadData::ShouldCancelPenalty() const inline void -ThreadData::IncreaseStolenTime(bigtime_t stolenTime) +ThreadData::SetStolenInterruptTime(bigtime_t interruptTime) { SCHEDULER_ENTER_FUNCTION(); - fStolenTime += stolenTime; + + interruptTime -= fLastInterruptTime; + fStolenTime += interruptTime; + fMeasureActiveTime -= interruptTime; }