diff options
author | Doug Gilbert <dgilbert@us.ibm.com> | 2011-09-26 13:36:33 -0500 |
---|---|---|
committer | Douglas R. Gilbert <dgilbert@us.ibm.com> | 2011-10-25 11:16:20 -0500 |
commit | 5ab488739184f2b2649193e3f9da695ee334d04f (patch) | |
tree | 3d47e74b8dd290598527988adccff0ff57c72dc0 /src/kernel/cpumgr.C | |
parent | d127ad9d985ffd7a42dba798bee66654242c4fe6 (diff) | |
download | talos-hostboot-5ab488739184f2b2649193e3f9da695ee334d04f.tar.gz talos-hostboot-5ab488739184f2b2649193e3f9da695ee334d04f.zip |
new HEAP manager to reduce fragmentation
Change-Id: Ibe725a43e6366d9113ec99df1cc6aafa7bbb770e
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/431
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Reviewed-by: Douglas R. Gilbert <dgilbert@us.ibm.com>
Diffstat (limited to 'src/kernel/cpumgr.C')
-rw-r--r-- | src/kernel/cpumgr.C | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C index 86e8653bf..6ec3b9f6d 100644 --- a/src/kernel/cpumgr.C +++ b/src/kernel/cpumgr.C @@ -34,10 +34,14 @@ #include <sys/sync.h> #include <kernel/cpuid.H> #include <kernel/ptmgr.H> +#include <kernel/heapmgr.H> cpu_t* CpuManager::cv_cpus[CpuManager::MAXCPUS] = { NULL }; bool CpuManager::cv_shutdown_requested = false; uint64_t CpuManager::cv_shutdown_status = 0; +Barrier CpuManager::cv_barrier; +bool CpuManager::cv_defrag = false; +size_t CpuManager::cv_cpuCount = 0; CpuManager::CpuManager() { @@ -150,6 +154,7 @@ void CpuManager::startCPU(ssize_t i) if (currentCPU) { setDEC(TimeManager::getTimeSliceCount()); + activateCPU(cv_cpus[i]); } return; } @@ -157,10 +162,18 @@ void CpuManager::startCPU(ssize_t i) void CpuManager::startSlaveCPU(cpu_t* cpu) { setDEC(TimeManager::getTimeSliceCount()); + activateCPU(cpu); return; } +void CpuManager::activateCPU(cpu_t * i_cpu) +{ + i_cpu->active = true; + ++cv_cpuCount; + lwsync(); +} + void CpuManager::executePeriodics(cpu_t * i_cpu) { if(i_cpu->master) @@ -169,11 +182,11 @@ void CpuManager::executePeriodics(cpu_t * i_cpu) if(0 == (i_cpu->periodic_count % CPU_PERIODIC_CHECK_MEMORY)) { uint64_t pcntAvail = PageManager::queryAvail(); - if(pcntAvail < 16) // Less than 16% pages left TODO 16 ok? + if(pcntAvail < 16) { VmmManager::flushPageTable(); ++(i_cpu->periodic_count); // prevent another flush below - if(pcntAvail < 5) // TODO 5% ok + if(pcntAvail < 5) { VmmManager::castOutPages(VmmManager::CRITICAL); } @@ -187,6 +200,31 @@ void CpuManager::executePeriodics(cpu_t * i_cpu) { VmmManager::flushPageTable(); } + if(0 == (i_cpu->periodic_count % CPU_PERIODIC_DEFRAG)) + { + // set up barrier based on # cpus cv_barrier; + // TODO whatif other cpus become active? + isync(); + cv_barrier.init(cv_cpuCount); + if(!cv_shutdown_requested) + { + cv_defrag = true; + lwsync(); + } + } + } + if(cv_defrag) + { + cv_barrier.wait(); + + if(i_cpu->master) + { + HeapManager::coalesce(); + PageManager::coalesce(); + cv_defrag = false; + } + + cv_barrier.wait(); } } |