summaryrefslogtreecommitdiffstats
path: root/src/include/kernel/pagemgr.H
diff options
context:
space:
mode:
authorDoug Gilbert <dgilbert@us.ibm.com>2011-09-26 13:36:33 -0500
committerDouglas R. Gilbert <dgilbert@us.ibm.com>2011-10-25 11:16:20 -0500
commit5ab488739184f2b2649193e3f9da695ee334d04f (patch)
tree3d47e74b8dd290598527988adccff0ff57c72dc0 /src/include/kernel/pagemgr.H
parentd127ad9d985ffd7a42dba798bee66654242c4fe6 (diff)
downloadtalos-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.H35
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
OpenPOWER on IntegriCloud