diff options
author | Matthew Barth <msbarth@us.ibm.com> | 2011-10-20 15:49:12 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2011-10-25 15:12:23 -0500 |
commit | 0ad20184aec21ef0560a9eee7e7c26a36ace07e1 (patch) | |
tree | bb402e0c2342a791074fde9939701a1bbf9dedef /src/include/kernel/pagemgr.H | |
parent | 5ab488739184f2b2649193e3f9da695ee334d04f (diff) | |
download | talos-hostboot-0ad20184aec21ef0560a9eee7e7c26a36ace07e1.tar.gz talos-hostboot-0ad20184aec21ef0560a9eee7e7c26a36ace07e1.zip |
Update kernel 'EVICT' pages path to cast out pages when low on memory.
Change-Id: I79b9cfad5d80267c6709b094d7f852d89e08534b
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/452
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/include/kernel/pagemgr.H')
-rw-r--r-- | src/include/kernel/pagemgr.H | 61 |
1 files changed, 36 insertions, 25 deletions
diff --git a/src/include/kernel/pagemgr.H b/src/include/kernel/pagemgr.H index 3ed2c1b34..41fb1e493 100644 --- a/src/include/kernel/pagemgr.H +++ b/src/include/kernel/pagemgr.H @@ -39,6 +39,7 @@ class PageManager { public: + static void init(); static void* allocatePage(size_t n = 1); @@ -57,53 +58,63 @@ class PageManager */ static void coalesce( void ); - enum - { - MEMLEN = VmmManager::HTABORG, + /** + * Retrieve the number of available pages + * @returns Number of free pages + */ + static uint64_t availPages(); - BUCKETS = 16, - }; + enum + { + MEMLEN = VmmManager::HTABORG, + BUCKETS = 16, + }; protected: - PageManager(); - ~PageManager() {}; + + PageManager(); + ~PageManager() {}; private: - void* _allocatePage(size_t); - void _freePage(void*, size_t); + + void* _allocatePage(size_t); + void _freePage(void*, size_t); void _coalesce( void ); //!< see coalesce() /** see queryAvail() */ - ALWAYS_INLINE - uint64_t _queryAvail() const + ALWAYS_INLINE uint64_t _queryAvail() const { return (100*iv_pagesAvail)/iv_pagesTotal; } - ALWAYS_INLINE - uint64_t firstPageAddr( void ) + ALWAYS_INLINE uint64_t firstPageAddr( void ) { return ALIGN_PAGE(VFS_LAST_ADDRESS); } - - /** Statistics on number of free pages (for debug) */ + /** see availPages() */ + ALWAYS_INLINE uint64_t _availPages() const + { + return iv_pagesAvail; + } + + /** Statistics on number of free pages (for debug) */ uint64_t iv_pagesAvail; - /** Total number of pages */ + /** Total number of pages */ uint64_t iv_pagesTotal; - struct page_t - { - page_t* next; //!< Next block of pages + static size_t cv_coalesce_count; //!< running coalesced counter + + struct page_t + { + page_t* next; //!< Next block of pages page_t* prev; //!< Prev block of pages page_t* key; //!< Key for pqueue - }; - Util::Lockfree::Stack<page_t> first_page[BUCKETS]; + }; + Util::Lockfree::Stack<page_t> first_page[BUCKETS]; - page_t* pop_bucket(size_t); - void push_bucket(page_t*, size_t); - - static size_t cv_coalesce_count; //!< running coalesced counter + page_t* pop_bucket(size_t); + void push_bucket(page_t*, size_t); }; #endif |