summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/kernel/basesegment.H5
-rw-r--r--src/include/kernel/block.H14
-rw-r--r--src/include/kernel/cpu.H3
-rw-r--r--src/include/kernel/cpumgr.H14
-rw-r--r--src/include/kernel/pagemgr.H17
-rw-r--r--src/include/kernel/ptmgr.H10
-rw-r--r--src/include/kernel/segment.H6
-rw-r--r--src/include/kernel/segmentmgr.H10
-rw-r--r--src/include/kernel/vmmmgr.H23
9 files changed, 100 insertions, 2 deletions
diff --git a/src/include/kernel/basesegment.H b/src/include/kernel/basesegment.H
index da262c2a0..574be1a1f 100644
--- a/src/include/kernel/basesegment.H
+++ b/src/include/kernel/basesegment.H
@@ -106,6 +106,11 @@ class BaseSegment : public Segment
static int mmSetPermission(void* i_va,
uint64_t i_size,
PAGE_PERMISSIONS i_access_type);
+ /**
+ * @breif Cast out older physical memory pages
+ * @param[in] castout Constraint
+ */
+ virtual void castOutPages(uint64_t i_type);
private:
/**
diff --git a/src/include/kernel/block.H b/src/include/kernel/block.H
index 2421f97f9..88c6664c2 100644
--- a/src/include/kernel/block.H
+++ b/src/include/kernel/block.H
@@ -156,6 +156,20 @@ class Block
void updateRefCount( uint64_t i_vaddr,
PageTableManager::UsageStats_t i_stats );
+ /**
+ * @brief Cast out older phyiscal memory pages
+ * @param[in] i_type - Castout contraint @see VmmManager::castOutPages()
+ * @return number of pages cast out
+ */
+ size_t castOutPages(uint64_t i_type);
+
+ /**
+ * @brief Evict a memory page
+ * @param[in] i_pte shadow page table entry
+ * @return true of page was evicted
+ */
+ bool evictPage(ShadowPTE* i_pte);
+
friend class Segment;
friend class BaseSegment;
friend class StackSegment;
diff --git a/src/include/kernel/cpu.H b/src/include/kernel/cpu.H
index ee24bdd64..ac09da288 100644
--- a/src/include/kernel/cpu.H
+++ b/src/include/kernel/cpu.H
@@ -77,6 +77,9 @@ struct cpu_t
/** XSCOM mutex to serialize access per CPU */
mutex_t xscom_mutex;
+
+ /** counter for executePeriodics */
+ size_t periodic_count;
};
/** @fn getCpuId
diff --git a/src/include/kernel/cpumgr.H b/src/include/kernel/cpumgr.H
index 31759564b..b60c72bc6 100644
--- a/src/include/kernel/cpumgr.H
+++ b/src/include/kernel/cpumgr.H
@@ -29,7 +29,12 @@
class CpuManager
{
public:
- enum { MAXCPUS = KERNEL_MAX_SUPPORTED_CPUS };
+ enum
+ {
+ MAXCPUS = KERNEL_MAX_SUPPORTED_CPUS,
+ CPU_PERIODIC_CHECK_MEMORY = 64,
+ CPU_PERIODIC_FLUSH_PAGETABLE = 1024,
+ };
/** @fn getCurrentCPU
* Returns a pointer to the current CPU structure by using the
@@ -60,6 +65,13 @@ class CpuManager
*/
static uint32_t getShutdownStatus() { return cv_shutdown_status; }
+ /** @fn executePeriodics
+ * Perform periodic actions
+ * @param[in] cpu_t the CPU
+ */
+ static void executePeriodics(cpu_t * i_cpu);
+
+
protected:
CpuManager();
~CpuManager() {}
diff --git a/src/include/kernel/pagemgr.H b/src/include/kernel/pagemgr.H
index eeed535e0..6cb6fefc4 100644
--- a/src/include/kernel/pagemgr.H
+++ b/src/include/kernel/pagemgr.H
@@ -27,6 +27,8 @@
#include <limits.h>
#include <util/lockfree/stack.H>
#include <kernel/vmmmgr.H>
+#include <builtins.h>
+#include <kernel/console.H>
/** @class PageManager
* @brief Manages the allocation of memory pages.
@@ -40,6 +42,12 @@ class PageManager
static void* allocatePage(size_t n = 1);
static void freePage(void*, size_t n = 1);
+ /**
+ * Query state for available memory
+ * @returns percent of pages available
+ */
+ static uint64_t queryAvail();
+
enum
{
MEMLEN = VmmManager::HTABORG,
@@ -55,8 +63,17 @@ class PageManager
void* _allocatePage(size_t);
void _freePage(void*, size_t);
+ /** see queryAvail() */
+ ALWAYS_INLINE
+ uint64_t _queryAvail() const
+ {
+ return (100*iv_pagesAvail)/iv_pagesTotal;
+ }
+
/** Statistics on number of free pages (for debug) */
uint64_t iv_pagesAvail;
+ /** Total number of pages */
+ uint64_t iv_pagesTotal;
struct page_t
{
diff --git a/src/include/kernel/ptmgr.H b/src/include/kernel/ptmgr.H
index 8eca3f213..9ae092857 100644
--- a/src/include/kernel/ptmgr.H
+++ b/src/include/kernel/ptmgr.H
@@ -160,6 +160,11 @@ class PageTableManager
*/
static void printPT( void );
+ /**
+ * @brief Flush reference status & unload unused pages
+ */
+ static void flush( void );
+
protected:
/**
@@ -452,6 +457,11 @@ class PageTableManager
*/
void pushUsageStats( PageTableEntry* i_pte );
+ /**
+ * @brief see flush
+ */
+ void _flush( void );
+
// Allow testcase to see inside
friend class ptmgrtest;
};
diff --git a/src/include/kernel/segment.H b/src/include/kernel/segment.H
index d7a4a7547..798539309 100644
--- a/src/include/kernel/segment.H
+++ b/src/include/kernel/segment.H
@@ -89,6 +89,12 @@ class Segment
return;
};
+ /**
+ * @brief Cast out older physical memory pages
+ * @param[in] i_type Constraint @see VmmManager::castOutPages
+ */
+ virtual void castOutPages(uint64_t i_type) {} // default to NOOP
+
protected:
/** The base address of the segment. */
const uint64_t iv_baseAddress;
diff --git a/src/include/kernel/segmentmgr.H b/src/include/kernel/segmentmgr.H
index a8f4e002d..7232c7d4f 100644
--- a/src/include/kernel/segmentmgr.H
+++ b/src/include/kernel/segmentmgr.H
@@ -118,6 +118,12 @@ class SegmentManager
static void updateRefCount( uint64_t i_vaddr,
PageTableManager::UsageStats_t i_stats );
+ /**
+ * @brief Cast out oldest physical memory pages
+ * @param[in] castout type
+ */
+ static void castOutPages(uint64_t i_type);
+
private:
/** See handlePageFault. */
@@ -129,11 +135,13 @@ class SegmentManager
/** See updateRefCount. */
void _updateRefCount( uint64_t i_vaddr,
PageTableManager::UsageStats_t i_stats );
+ /** See castOutPages */
+ void _castOutPages(uint64_t i_type);
/** See findPhysicalAddress */
uint64_t _findPhysicalAddress(uint64_t i_vaddr) const;
- ALWAYS_INLINE inline
+ ALWAYS_INLINE
size_t getSegmentIdFromAddress(uint64_t i_addr) const
{
return i_addr >> SLBE_s;
diff --git a/src/include/kernel/vmmmgr.H b/src/include/kernel/vmmmgr.H
index ef8e6c362..5c7a75d5d 100644
--- a/src/include/kernel/vmmmgr.H
+++ b/src/include/kernel/vmmmgr.H
@@ -55,6 +55,12 @@ class VmmManager
RO_EXE_ACCESS,
};
+ enum castout_t
+ {
+ NORMAL,
+ CRITICAL,
+ };
+
static void init();
static void init_slb();
@@ -104,6 +110,17 @@ class VmmManager
* @return the physical address or -EFAULT @see errno.h
*/
static uint64_t findPhysicalAddress(uint64_t i_vaddr);
+
+ /**
+ * @brief Cast out older physical memory pages
+ * @param[in] castout constraint
+ */
+ static void castOutPages(castout_t i_ct);
+
+ /**
+ * @brief Flush pagetable, Update shadow page info
+ */
+ static void flushPageTable( void);
/**
* @brief Remove pages by a specified operation of the given size
@@ -157,6 +174,12 @@ class VmmManager
/* See mmSetPermission */
int _mmSetPermission(void* i_va,uint64_t i_size, PAGE_PERMISSIONS i_access_type);
+ /** See castOutPages */
+ void _castOutPages(castout_t i_ct);
+
+ /** See flushPageTable */
+ void _flushPageTable( void );
+
public:
friend class Block;
OpenPOWER on IntegriCloud