diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/kernel/basesegment.H | 5 | ||||
-rw-r--r-- | src/include/kernel/block.H | 14 | ||||
-rw-r--r-- | src/include/kernel/cpu.H | 3 | ||||
-rw-r--r-- | src/include/kernel/cpumgr.H | 14 | ||||
-rw-r--r-- | src/include/kernel/pagemgr.H | 17 | ||||
-rw-r--r-- | src/include/kernel/ptmgr.H | 10 | ||||
-rw-r--r-- | src/include/kernel/segment.H | 6 | ||||
-rw-r--r-- | src/include/kernel/segmentmgr.H | 10 | ||||
-rw-r--r-- | src/include/kernel/vmmmgr.H | 23 |
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; |