change newblock allocation function interface to add a expand flag
authorGengbin Zheng <gzheng@illinois.edu>
Wed, 12 Oct 2011 05:33:25 +0000 (22:33 -0700)
committerGengbin Zheng <gzheng@illinois.edu>
Wed, 12 Oct 2011 05:33:25 +0000 (22:33 -0700)
src/arch/gemini_gni/machine.c
src/arch/util/mempool.c
src/arch/util/mempool.h

index b94bf8464ec9e5efd0c0beac2fed42ab4ce7808d..9a84ba8b829f06be6b88782c007e63015014597d 100644 (file)
@@ -40,7 +40,9 @@ static void sleep(int secs) {
 #define USE_LRTS_MEMPOOL     1
 
 #if USE_LRTS_MEMPOOL
-static CmiInt8 _mempool_size = 1024ll*1024*32;
+#define oneMB (1024ll*1024)
+static CmiInt8 _mempool_size = 32*oneMB;
+static CmiInt8 _expand_mem =  16*oneMB;
 #endif
 
 #define PRINT_SYH  0
@@ -1645,9 +1647,13 @@ static void _init_DMA_buffer()
     allgather(&DMA_buffer_base_mdh_addr, DMA_buffer_base_mdh_addr_vec, sizeof(mdh_addr_t) );
 }
 
-void *alloc_mempool_block(size_t *size, gni_mem_handle_t *mem_hndl)
+void *alloc_mempool_block(size_t *size, gni_mem_handle_t *mem_hndl, int expand_flag)
 {
-    void *pool = memalign(ALIGNBUF, *size);
+    void *pool;
+
+    int default_size =  expand_flag? _expand_mem : _mempool_size;
+    if (*size < default_size) *size = default_size;
+    pool = memalign(ALIGNBUF, *size);
     gni_return_t status = MEMORY_REGISTER(onesided_hnd, nic_hndl, pool, *size,  mem_hndl, &omdh);
     GNI_RC_CHECK("Mempool register", status);
     return pool;
index 948276f5fbdc9a7dc8b7ac5adce76d4cbabfbccd..bf419330c97301b4fdc80682623a08c5a76b6836 100644 (file)
@@ -24,11 +24,6 @@ Generalized by Gengbin Zheng  10/5/2011
 
 #include "mempool.h"
 
-#if CMK_CONVERSE_GEMINI_UGNI
-static      size_t     expand_mem = 1024ll*1024*16;
-#else
-static      size_t     expand_mem = 1024*16;
-#endif
 
 mempool_type *mempool_init(size_t pool_size, mempool_newblockfn allocfn, mempool_freeblock freefn)
 {
@@ -36,7 +31,7 @@ mempool_type *mempool_init(size_t pool_size, mempool_newblockfn allocfn, mempool
     mempool_header *header;
     mem_handle_t  mem_hndl;
 
-    void *pool = allocfn(&pool_size, &mem_hndl);
+    void *pool = allocfn(&pool_size, &mem_hndl, 0);
     mptr = (mempool_type*)pool;
     mptr->newblockfn = allocfn;
     mptr->freeblockfn = freefn;
@@ -135,8 +130,9 @@ void*  mempool_malloc(mempool_type *mptr, int size, int expand)
 
         if (!expand) return NULL;
 
-        expand_size = expand_mem>size ? expand_mem:2*size; 
-        pool = mptr->newblockfn(&expand_size, &mem_hndl);
+         /* set minimum size, newblockfn checks against the default size */
+        expand_size = 2*size; 
+        pool = mptr->newblockfn(&expand_size, &mem_hndl, 1);
         expand_pool = (mempool_block*)pool;
         expand_pool->mempool_ptr = pool;
         expand_pool->mem_hndl = mem_hndl;
@@ -155,7 +151,7 @@ void*  mempool_malloc(mempool_type *mptr, int size, int expand)
         bestfit->next_free = 0;
         bestfit_size = expand_size-sizeof(mempool_block);
 #if 1
-         /* insert bestfit to sorted free list */
+         /* insert bestfit to the sorted free list */
         previous = NULL;
         current = freelist_head_ptr;
         while (current) 
index e78210cd39ee80911bbd8cd024c4725ef0ed687b..76cf1e52b4a963eba2ec811ccd98e6e1562669e4 100644 (file)
@@ -31,7 +31,7 @@ typedef struct mempool_header
   size_t            next_free;
 } mempool_header;
 
-typedef void * (* mempool_newblockfn)(size_t *size, mem_handle_t *mem_hndl);
+typedef void * (* mempool_newblockfn)(size_t *size, mem_handle_t *mem_hndl, int expand_flag);
 typedef void (* mempool_freeblock)(void *ptr, mem_handle_t mem_hndl);
 
 // only at beginning of first block of mempool