summaryrefslogtreecommitdiffstats
path: root/src/kernel/cpumgr.C
diff options
context:
space:
mode:
authorDoug Gilbert <dgilbert@us.ibm.com>2011-09-12 12:47:53 -0500
committerDouglas R. Gilbert <dgilbert@us.ibm.com>2011-09-19 16:05:34 -0500
commitde8a529d349aebb344979609055f123c196ccfe3 (patch)
treeb91665407f69730aaba8da794afc47240997dd47 /src/kernel/cpumgr.C
parentb754f8b47e343f449e5f05f67b948513363abd12 (diff)
downloadtalos-hostboot-de8a529d349aebb344979609055f123c196ccfe3.tar.gz
talos-hostboot-de8a529d349aebb344979609055f123c196ccfe3.zip
Mechanism to detect low memory and cast out older page
Change-Id: Icce8e01f3d1cd2942f2b9ff802993da0441535ee Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/344 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.C32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C
index d8a9960f6..01af160f1 100644
--- a/src/kernel/cpumgr.C
+++ b/src/kernel/cpumgr.C
@@ -33,6 +33,7 @@
#include <kernel/timemgr.H>
#include <sys/sync.h>
#include <kernel/cpuid.H>
+#include <kernel/ptmgr.H>
cpu_t* CpuManager::cv_cpus[CpuManager::MAXCPUS] = { NULL };
bool CpuManager::cv_shutdown_requested = false;
@@ -141,6 +142,7 @@ void CpuManager::startCPU(ssize_t i)
// Create idle task.
cpu->idle_task = TaskManager::createIdleTask();
cpu->idle_task->cpu = cpu;
+ cpu->periodic_count = 0;
printk("done\n");
}
@@ -160,3 +162,33 @@ void CpuManager::startSlaveCPU(cpu_t* cpu)
return;
}
+
+void CpuManager::executePeriodics(cpu_t * i_cpu)
+{
+ if(i_cpu->master)
+ {
+ ++(i_cpu->periodic_count);
+ 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?
+ {
+ VmmManager::flushPageTable();
+ ++(i_cpu->periodic_count); // prevent another flush below
+ if(pcntAvail < 5) // TODO 5% ok
+ {
+ VmmManager::castOutPages(VmmManager::CRITICAL);
+ }
+ else
+ {
+ VmmManager::castOutPages(VmmManager::NORMAL);
+ }
+ }
+ }
+ if(0 == (i_cpu->periodic_count % CPU_PERIODIC_FLUSH_PAGETABLE))
+ {
+ VmmManager::flushPageTable();
+ }
+ }
+}
+
OpenPOWER on IntegriCloud