summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2012-07-13 21:28:37 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-07-16 14:00:44 -0500
commit1535c27d4a7a970f3e14ace7cb980ae06820e9ec (patch)
tree5cc9f264592f90f56c40bc12a50d1c6a6261b89a /src/kernel
parent7f482f9ad23bd7689fdee5982ad91f8506b2dfb8 (diff)
downloadtalos-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.C17
-rw-r--r--src/kernel/ptmgr.C65
-rw-r--r--src/kernel/syscall.C9
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();
+ }
+
}
};
OpenPOWER on IntegriCloud