From d6efe8ee75c6efaf53c479c028f8e158e385ff2c Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Wed, 23 Oct 2013 21:56:14 +0200 Subject: [PATCH] kernel: Update cpu_ent::active_time atomically --- src/system/kernel/cpu.cpp | 7 +------ src/system/kernel/scheduler/scheduler_affine.cpp | 2 +- src/system/kernel/scheduler/scheduler_simple.cpp | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/system/kernel/cpu.cpp b/src/system/kernel/cpu.cpp index 36df9aa7cc..bacc8a3ec7 100644 --- a/src/system/kernel/cpu.cpp +++ b/src/system/kernel/cpu.cpp @@ -74,12 +74,7 @@ cpu_get_active_time(int32 cpu) if (cpu < 0 || cpu > smp_get_num_cpus()) return 0; - // We need to grab the scheduler lock here, because the thread activity - // time is not maintained atomically (because there is no need to). - - InterruptsSpinLocker schedulerLocker(gSchedulerLock); - - return gCPU[cpu].active_time; + return atomic_get64(&gCPU[cpu].active_time); } diff --git a/src/system/kernel/scheduler/scheduler_affine.cpp b/src/system/kernel/scheduler/scheduler_affine.cpp index 37208fc639..bf1652b59c 100644 --- a/src/system/kernel/scheduler/scheduler_affine.cpp +++ b/src/system/kernel/scheduler/scheduler_affine.cpp @@ -1213,7 +1213,7 @@ affine_track_cpu_activity(Thread* oldThread, Thread* nextThread, int32 thisCore) = (oldThread->kernel_time - oldThread->cpu->last_kernel_time) + (oldThread->user_time - oldThread->cpu->last_user_time); - oldThread->cpu->active_time += active; + atomic_add64(&oldThread->cpu->active_time, active); sCoreEntries[thisCore].fActiveTime += active; } diff --git a/src/system/kernel/scheduler/scheduler_simple.cpp b/src/system/kernel/scheduler/scheduler_simple.cpp index e4d413b2b1..c2b2e3aedb 100644 --- a/src/system/kernel/scheduler/scheduler_simple.cpp +++ b/src/system/kernel/scheduler/scheduler_simple.cpp @@ -634,9 +634,9 @@ simple_reschedule(void) // track CPU activity if (!thread_is_idle_thread(oldThread)) { - oldThread->cpu->active_time += + atomic_add64(&oldThread->cpu->active_time, (oldThread->kernel_time - oldThread->cpu->last_kernel_time) - + (oldThread->user_time - oldThread->cpu->last_user_time); + + (oldThread->user_time - oldThread->cpu->last_user_time)); } if (!thread_is_idle_thread(nextThread)) {