diff options
| author | Patrick Williams <iawillia@us.ibm.com> | 2012-07-13 21:28:37 -0500 |
|---|---|---|
| committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2012-07-16 14:00:44 -0500 |
| commit | 1535c27d4a7a970f3e14ace7cb980ae06820e9ec (patch) | |
| tree | 5cc9f264592f90f56c40bc12a50d1c6a6261b89a /src/kernel | |
| parent | 7f482f9ad23bd7689fdee5982ad91f8506b2dfb8 (diff) | |
| download | talos-hostboot-1535c27d4a7a970f3e14ace7cb980ae06820e9ec.tar.gz talos-hostboot-1535c27d4a7a970f3e14ace7cb980ae06820e9ec.zip | |
Improve user-space page allocator.
* Allow page allocation system call to force coalesce if a
contiguous block is unavailable. [long-term enhancement]
* Workaround lack of large contiguous memory for PageTable
test-cases, which require 256K, by allocating a VMM block.
This should be removed when story 43401 is implemented.
[short-term workaround]
Change-Id: Idddb30eaa3aeac52d56b82a70355095f31d4a0cd
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/1369
Tested-by: Jenkins Server
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Reviewed-by: Douglas R. Gilbert <dgilbert@us.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/kernel')
| -rw-r--r-- | src/kernel/cpumgr.C | 17 | ||||
| -rw-r--r-- | src/kernel/ptmgr.C | 65 | ||||
| -rw-r--r-- | src/kernel/syscall.C | 9 |
3 files changed, 62 insertions, 29 deletions
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C index 2a5c2edcc..4fdc8fde9 100644 --- a/src/kernel/cpumgr.C +++ b/src/kernel/cpumgr.C @@ -43,6 +43,7 @@ uint64_t CpuManager::cv_shutdown_status = 0; Barrier CpuManager::cv_barrier; bool CpuManager::cv_defrag = false; size_t CpuManager::cv_cpuCount = 0; +bool CpuManager::cv_forcedMemPeriodic = false; InteractiveDebug CpuManager::cv_interactive_debug; CpuManager::CpuManager() @@ -188,11 +189,16 @@ void CpuManager::executePeriodics(cpu_t * i_cpu) cv_interactive_debug.startDebugTask(); } + bool forceMemoryPeriodic = __sync_fetch_and_and(&cv_forcedMemPeriodic, + false); + ++(i_cpu->periodic_count); - if(0 == (i_cpu->periodic_count % CPU_PERIODIC_CHECK_MEMORY)) + if((0 == (i_cpu->periodic_count % CPU_PERIODIC_CHECK_MEMORY)) || + (forceMemoryPeriodic)) { uint64_t pcntAvail = PageManager::queryAvail(); - if(pcntAvail < PageManager::LOWMEM_NORM_LIMIT) + if((pcntAvail < PageManager::LOWMEM_NORM_LIMIT) || + (forceMemoryPeriodic)) { VmmManager::flushPageTable(); ++(i_cpu->periodic_count); // prevent another flush below @@ -210,7 +216,8 @@ void CpuManager::executePeriodics(cpu_t * i_cpu) { VmmManager::flushPageTable(); } - if(0 == (i_cpu->periodic_count % CPU_PERIODIC_DEFRAG)) + if((0 == (i_cpu->periodic_count % CPU_PERIODIC_DEFRAG)) || + (forceMemoryPeriodic)) { // set up barrier based on # cpus cv_barrier; // TODO whatif other cpus become active? @@ -240,3 +247,7 @@ void CpuManager::executePeriodics(cpu_t * i_cpu) } } +void CpuManager::forceMemoryPeriodic() +{ + cv_forcedMemPeriodic = true; +} diff --git a/src/kernel/ptmgr.C b/src/kernel/ptmgr.C index 3d7f28578..bf8937b78 100644 --- a/src/kernel/ptmgr.C +++ b/src/kernel/ptmgr.C @@ -1,25 +1,26 @@ -// IBM_PROLOG_BEGIN_TAG -// This is an automatically generated prolog. -// -// $Source: src/kernel/ptmgr.C $ -// -// IBM CONFIDENTIAL -// -// COPYRIGHT International Business Machines Corp. 2011 -// -// p1 -// -// Object Code Only (OCO) source materials -// Licensed Internal Code Source Materials -// IBM HostBoot Licensed Internal Code -// -// The source code for this program is not published or other- -// wise divested of its trade secrets, irrespective of what has -// been deposited with the U.S. Copyright Office. -// -// Origin: 30 -// -// IBM_PROLOG_END +/* IBM_PROLOG_BEGIN_TAG + * This is an automatically generated prolog. + * + * $Source: src/kernel/ptmgr.C $ + * + * IBM CONFIDENTIAL + * + * COPYRIGHT International Business Machines Corp. 2011-2012 + * + * p1 + * + * Object Code Only (OCO) source materials + * Licensed Internal Code Source Materials + * IBM HostBoot Licensed Internal Code + * + * The source code for this program is not published or other- + * wise divested of its trade secrets, irrespective of what has + * been deposited with the U.S. Copyright Office. + * + * Origin: 30 + * + * IBM_PROLOG_END_TAG + */ #include <kernel/ptmgr.H> #include <kernel/vmmmgr.H> #include <util/singleton.H> @@ -295,7 +296,8 @@ void PageTableManager::flush( void ) /******************** Private/Protected Methods ********************/ - +#include <sys/mm.h> //@TODO: Remove with 43401 +#include <usr/vmmconst.h> //@TODO: Remove with 43401. /** * @brief Constructor */ @@ -304,7 +306,16 @@ PageTableManager::PageTableManager( bool i_userSpace ) { if( i_userSpace ) { - ivTABLE = new char[getSize()]; + //@TODO: Remove with 43401. + // Don't have enough contiguous memory to do this allocation, so + // allocate a VMM block instead. + ivTABLE = reinterpret_cast<char*>(VMM_VADDR_RMVPAGE_TEST - getSize()); + mm_alloc_block(NULL, ivTABLE, getSize()); + mm_set_permission(ivTABLE, getSize(), WRITABLE | ALLOCATE_FROM_ZERO); + + //@TODO: Add back after 43401. + //ivTABLE = new char[getSize()]; + //printk( "** PageTableManager running in USER_SPACE : ivTABLE = %p**\n", ivTABLE ); } else @@ -335,7 +346,11 @@ void PageTableManager::invalidatePT( void ) PageTableManager::~PageTableManager() { if( ivTABLE ) { - delete[] ivTABLE; + //@TODO: Remove after 43401. + mm_remove_pages(RELEASE, ivTABLE, getSize()); + + //@TODO: Add back after 43401. + //delete[] ivTABLE; } } diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C index b6fa46f8a..b061a4877 100644 --- a/src/kernel/syscall.C +++ b/src/kernel/syscall.C @@ -677,8 +677,10 @@ namespace Systemcalls */ void MmAllocPages(task_t* t) { + ssize_t pages = TASK_GETARG0(t); + // Attempt to allocate the page(s). - void* page = PageManager::allocatePage(TASK_GETARG0(t), true); + void* page = PageManager::allocatePage(pages, true); TASK_SETRTN(t, reinterpret_cast<uint64_t>(page)); // If we are low on memory, call into the VMM to free some up. @@ -696,6 +698,11 @@ namespace Systemcalls __sync_lock_release(&one_at_a_time); } } + else if ((page == NULL) && (pages > 1)) + { + CpuManager::forceMemoryPeriodic(); + } + } }; |

