diff options
author | Doug Gilbert <dgilbert@us.ibm.com> | 2011-09-12 12:47:53 -0500 |
---|---|---|
committer | Douglas R. Gilbert <dgilbert@us.ibm.com> | 2011-09-19 16:05:34 -0500 |
commit | de8a529d349aebb344979609055f123c196ccfe3 (patch) | |
tree | b91665407f69730aaba8da794afc47240997dd47 /src/kernel/cpumgr.C | |
parent | b754f8b47e343f449e5f05f67b948513363abd12 (diff) | |
download | talos-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.C | 32 |
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(); + } + } +} + |