diff options
author | Doug Gilbert <dgilbert@us.ibm.com> | 2011-09-26 13:36:33 -0500 |
---|---|---|
committer | Douglas R. Gilbert <dgilbert@us.ibm.com> | 2011-10-25 11:16:20 -0500 |
commit | 5ab488739184f2b2649193e3f9da695ee334d04f (patch) | |
tree | 3d47e74b8dd290598527988adccff0ff57c72dc0 /src/include/kernel/pagemgr.H | |
parent | d127ad9d985ffd7a42dba798bee66654242c4fe6 (diff) | |
download | talos-hostboot-5ab488739184f2b2649193e3f9da695ee334d04f.tar.gz talos-hostboot-5ab488739184f2b2649193e3f9da695ee334d04f.zip |
new HEAP manager to reduce fragmentation
Change-Id: Ibe725a43e6366d9113ec99df1cc6aafa7bbb770e
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/431
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Reviewed-by: Douglas R. Gilbert <dgilbert@us.ibm.com>
Diffstat (limited to 'src/include/kernel/pagemgr.H')
-rw-r--r-- | src/include/kernel/pagemgr.H | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/src/include/kernel/pagemgr.H b/src/include/kernel/pagemgr.H index 6cb6fefc4..3ed2c1b34 100644 --- a/src/include/kernel/pagemgr.H +++ b/src/include/kernel/pagemgr.H @@ -29,6 +29,8 @@ #include <kernel/vmmmgr.H> #include <builtins.h> #include <kernel/console.H> +#include <util/align.H> +#include <sys/vfs.h> /** @class PageManager * @brief Manages the allocation of memory pages. @@ -37,10 +39,10 @@ class PageManager { public: - static void init(); + static void init(); - static void* allocatePage(size_t n = 1); - static void freePage(void*, size_t n = 1); + static void* allocatePage(size_t n = 1); + static void freePage(void*, size_t n = 1); /** * Query state for available memory @@ -48,9 +50,16 @@ class PageManager */ static uint64_t queryAvail(); - enum - { - MEMLEN = VmmManager::HTABORG, + /** + * Coalesce adjacent free memory blocks + * @pre This function can only be called from kernel space and + * requires that all other processes are quiesced + */ + static void coalesce( void ); + + enum + { + MEMLEN = VmmManager::HTABORG, BUCKETS = 16, }; @@ -62,6 +71,7 @@ class PageManager private: void* _allocatePage(size_t); void _freePage(void*, size_t); + void _coalesce( void ); //!< see coalesce() /** see queryAvail() */ ALWAYS_INLINE @@ -70,6 +80,13 @@ class PageManager return (100*iv_pagesAvail)/iv_pagesTotal; } + ALWAYS_INLINE + uint64_t firstPageAddr( void ) + { + return ALIGN_PAGE(VFS_LAST_ADDRESS); + } + + /** Statistics on number of free pages (for debug) */ uint64_t iv_pagesAvail; /** Total number of pages */ @@ -77,12 +94,16 @@ class PageManager struct page_t { - page_t* next; + 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]; page_t* pop_bucket(size_t); void push_bucket(page_t*, size_t); + + static size_t cv_coalesce_count; //!< running coalesced counter }; #endif |