mempool_malloc and free now handles pointers starts from mempool_header.
authorGengbin Zheng <gzheng@illinois.edu>
Fri, 7 Oct 2011 22:30:09 +0000 (15:30 -0700)
committerGengbin Zheng <gzheng@illinois.edu>
Fri, 7 Oct 2011 22:30:09 +0000 (15:30 -0700)
src/arch/gemini_gni/machine.c
src/arch/util/mempool.c
src/arch/util/mempool.h

index 257a0f81728ca57ab4b9f1ba1c74ea8079af2e7a..47ec63a9b3007835e3dd5ab13c5f11267827ec8f 100644 (file)
@@ -1669,7 +1669,7 @@ 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(int *size, gni_mem_handle_t *mem_hndl)
+void *alloc_mempool_block(size_t *size, gni_mem_handle_t *mem_hndl)
 {
     void *pool = memalign(ALIGNBUF, *size);
     gni_return_t status = MEMORY_REGISTER(onesided_hnd, nic_hndl, pool, *size,  mem_hndl, &omdh);
@@ -1846,11 +1846,12 @@ void* LrtsAlloc(int n_bytes, int header)
 #if     CMK_SMP
         CmiUnlock(mempoolLock);
 #endif
+        ptr = res - sizeof(mempool_header) + ALIGNBUF - header;
 #else
         n_bytes = ALIGN4(n_bytes);           /* make sure size if 4 aligned */
         char *res = memalign(ALIGNBUF, n_bytes+ALIGNBUF);
-#endif
         ptr = res + ALIGNBUF - header;
+#endif
     }
 #if 0 
     printf("Done Alloc Lrts for bytes=%d, head=%d\n", n_bytes, header);
@@ -1872,7 +1873,7 @@ void  LrtsFree(void *msg)
 #if     CMK_SMP
         CmiLock(mempoolLock);
 #endif
-        mempool_free(mempool, (char*)msg + sizeof(CmiChunkHeader) - ALIGNBUF);
+        mempool_free(mempool, (char*)msg + sizeof(CmiChunkHeader) - ALIGNBUF + sizeof(mempool_header));
 #if     CMK_SMP
         CmiUnlock(mempoolLock);
 #endif
index 722671f9fd303102173b0d1db7dce312ba300aaf..d493c86b48ca3fed13c2f66978aea3c785e6ec43 100644 (file)
@@ -32,7 +32,7 @@ mempool_type *mempool_init(size_t pool_size, mempool_newblockfn allocfn, mempool
     mempool_header *header;
     gni_mem_handle_t  mem_hndl;
 
-    void *pool = allocfn(pool_size, &mem_hndl);
+    void *pool = allocfn(&pool_size, &mem_hndl);
     mptr = (mempool_type*)pool;
     mptr->newblockfn = allocfn;
     mptr->freeblockfn = freefn;
@@ -81,6 +81,8 @@ void*  mempool_malloc(mempool_type *mptr, int size, int expand)
     CmiPrintf("[%d] request malloc from pool: %p  free_head: %p %d for size %d, \n", CmiMyPe(), mptr, freelist_head_ptr, mptr->freelist_head, size);
 #endif
 
+    size += sizeof(mempool_header);
+
 #if 1
     while(current!= NULL)     /* best fit */
     {
@@ -187,7 +189,7 @@ void*  mempool_malloc(mempool_type *mptr, int size, int expand)
 printf("[%d] freelist_head in malloc  offset:%d free_head: %ld %ld %d %d\n", myrank, (char*)bestfit-(char*)mptr, *freelist_head, ((mempool_header*)((char*)mptr+*freelist_head))->next_free, bestfit_size, size);
 #endif
     CmiAssert(*freelist_head >= 0);
-    return (char*)bestfit;
+    return (char*)bestfit + sizeof(mempool_header);
 }
 
 //sorted free_list and merge it if it become continous 
@@ -202,7 +204,9 @@ void mempool_free(mempool_type *mptr, void *ptr_free)
     mempool_header    *freelist_head_ptr;
     mempool_header    *current;
     mempool_header *previous = NULL;
-    mempool_header *to_free = (mempool_header *)ptr_free;
+    mempool_header *to_free;
+
+    to_free = (mempool_header *)((char*)ptr_free - sizeof(mempool_header));
 
     mempools_head = &(mptr->mempools_head);
     freelist_head = &mptr->freelist_head;
@@ -210,10 +214,10 @@ void mempool_free(mempool_type *mptr, void *ptr_free)
     current = freelist_head_ptr;
 
     free_size = to_free->size;
-    free_lastbytes_pos = (char*)ptr_free +free_size;
+    free_lastbytes_pos = (char*)to_free +free_size;
 
 #if  MEMPOOL_DEBUG
-    printf("[%d] INSIDE FREE ptr=%p, size=%d freehead=%p mutex: %p\n", CmiMyPe(), ptr_free, free_size, freelist_head, mptr->mutex);
+    printf("[%d] INSIDE FREE ptr=%p, size=%d freehead=%p mutex: %p\n", CmiMyPe(), to_free, free_size, freelist_head, mptr->mutex);
 #endif
     
     while(current!= NULL && current < to_free )
@@ -228,7 +232,7 @@ void mempool_free(mempool_type *mptr, void *ptr_free)
     if (current) CmiPrintf("[%d] previous=%p, current=%p size:%d %p\n", CmiMyPe(), previous, current, current->size, free_lastbytes_pos);
 #endif
     //continuos with previous free space 
-    if(previous!= NULL && (char*)previous+previous->size == ptr_free &&  memcmp(&previous->mem_hndl, &to_free->mem_hndl, sizeof(gni_mem_handle_t))==0 )
+    if(previous!= NULL && (char*)previous+previous->size == to_free &&  memcmp(&previous->mem_hndl, &to_free->mem_hndl, sizeof(gni_mem_handle_t))==0 )
     {
         previous->size +=  free_size;
         merged = 1;
@@ -261,7 +265,7 @@ void mempool_free(mempool_type *mptr, void *ptr_free)
             previous->next_free = (char*)to_free - (char*)mptr;
     }
 #if  MEMPOOL_DEBUG
-    printf("[%d] Memory free done %p, freelist_head=%p\n", CmiMyPe(), ptr_free,  freelist_head);
+    printf("[%d] Memory free done %p, freelist_head=%p\n", CmiMyPe(), to_free,  freelist_head);
 #endif
 
     CmiAssert(*freelist_head >= 0);
index 7f42f373cda7f9e90e39aee9dcc4067acf4ee98a..46c9aba7b66b731bc2f0ca066836a700da15e808 100644 (file)
@@ -30,7 +30,7 @@ typedef struct mempool_header
   size_t            next_free;
 } mempool_header;
 
-typedef void * (* mempool_newblockfn)(int *size, gni_mem_handle_t *mem_hndl);
+typedef void * (* mempool_newblockfn)(size_t *size, gni_mem_handle_t *mem_hndl);
 typedef void (* mempool_freeblock)(void *ptr, gni_mem_handle_t mem_hndl);
 
 // only at beginning of first block of mempool