summaryrefslogtreecommitdiffstats
path: root/src/kernel/cpumgr.C
diff options
context:
space:
mode:
authorDoug Gilbert <dgilbert@us.ibm.com>2011-09-26 13:36:33 -0500
committerDouglas R. Gilbert <dgilbert@us.ibm.com>2011-10-25 11:16:20 -0500
commit5ab488739184f2b2649193e3f9da695ee334d04f (patch)
tree3d47e74b8dd290598527988adccff0ff57c72dc0 /src/kernel/cpumgr.C
parentd127ad9d985ffd7a42dba798bee66654242c4fe6 (diff)
downloadtalos-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.C42
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();
}
}
OpenPOWER on IntegriCloud