From f2a73fcdbdff138c15ecd38d0bd4ce7f55bd3dcc Mon Sep 17 00:00:00 2001 From: Nathan Hjelm Date: Tue, 14 Jan 2014 16:26:06 +0000 Subject: [PATCH] udreg: free huge page allocations correctly This commit fixes an error path that occurs when huge page allocations are enabled. In this case we allocate a huge page and try to register it but fail. We then were calling free on the opal object. Fix this by calling the proper free function. cmr=v1.7.4:reviewer=rhc This commit was SVN r30289. --- ompi/mca/mpool/udreg/mpool_udreg_module.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/ompi/mca/mpool/udreg/mpool_udreg_module.c b/ompi/mca/mpool/udreg/mpool_udreg_module.c index 25f76f2e28..4c1fc04983 100644 --- a/ompi/mca/mpool/udreg/mpool_udreg_module.c +++ b/ompi/mca/mpool/udreg/mpool_udreg_module.c @@ -281,6 +281,12 @@ static int mca_mpool_udreg_alloc_huge (mca_mpool_udreg_module_t *mpool, size_t s return 0; } + +static void mca_mpool_udreg_free_huge (mca_mpool_udreg_hugepage_alloc_t *alloc) { + opal_list_remove_item (&alloc->huge_table->allocations, &alloc->super); + OBJ_RELEASE(alloc); +} + /** * allocate function */ @@ -320,8 +326,13 @@ void* mca_mpool_udreg_alloc(mca_mpool_base_module_t *mpool, size_t size, #endif } - if(OMPI_SUCCESS != mca_mpool_udreg_register(mpool, addr, size, flags, reg)) { - free(base_addr); + if (OMPI_SUCCESS != mca_mpool_udreg_register(mpool, addr, size, flags, reg)) { + if (udreg_module->huge_page) { + mca_mpool_udreg_free_huge ((mca_mpool_udreg_hugepage_alloc_t *) base_addr); + } else { + free(base_addr); + } + return NULL; } @@ -400,11 +411,6 @@ void* mca_mpool_udreg_realloc(mca_mpool_base_module_t *mpool, void *addr, return new_mem; } -static void mca_mpool_udreg_free_huge (mca_mpool_udreg_hugepage_alloc_t *alloc) { - opal_list_remove_item (&alloc->huge_table->allocations, &alloc->super); - OBJ_RELEASE(alloc); -} - /** * free function */