From 27edb7910a466277fd511ecd17855e5a67e836ae Mon Sep 17 00:00:00 2001 From: Lukasz Dorau Date: Wed, 30 Oct 2024 17:09:07 +0100 Subject: [PATCH 1/2] Cache page size of the provider in jemalloc pool Signed-off-by: Lukasz Dorau --- src/pool/pool_jemalloc.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/pool/pool_jemalloc.c b/src/pool/pool_jemalloc.c index 094ceeaf7..ceee16891 100644 --- a/src/pool/pool_jemalloc.c +++ b/src/pool/pool_jemalloc.c @@ -36,6 +36,7 @@ typedef struct jemalloc_memory_pool_t { umf_memory_provider_handle_t provider; + size_t page_size; // cached page size of the provider unsigned int arena_index; // index of jemalloc arena // set to true if umfMemoryProviderFree() should never be called bool disable_provider_free; @@ -401,6 +402,8 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider, assert(provider); assert(out_pool); + umf_result_t umf_result = UMF_RESULT_ERROR_UNKNOWN; + umf_jemalloc_pool_params_t *je_params = (umf_jemalloc_pool_params_t *)params; @@ -416,6 +419,13 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider, pool->provider = provider; + umf_result = + umfMemoryProviderGetMinPageSize(provider, NULL, &pool->page_size); + if (umf_result != UMF_RESULT_SUCCESS) { + LOG_ERR("umfMemoryProviderGetMinPageSize() failed"); + goto err_free_pool; + } + if (je_params) { pool->disable_provider_free = je_params->disable_provider_free; } else { @@ -427,6 +437,7 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider, NULL, 0); if (err) { LOG_ERR("Could not create arena."); + umf_result = UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC; goto err_free_pool; } @@ -438,6 +449,7 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider, snprintf(cmd, sizeof(cmd), "arena.%u.destroy", arena_index); je_mallctl(cmd, NULL, 0, NULL, 0); LOG_ERR("Could not setup extent_hooks for newly created arena."); + umf_result = UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC; goto err_free_pool; } @@ -452,7 +464,7 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider, err_free_pool: umf_ba_global_free(pool); - return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC; + return umf_result; } static void op_finalize(void *pool) { From 3cbc7a363033a48beed66f66f441f3e64baf633b Mon Sep 17 00:00:00 2001 From: Lukasz Dorau Date: Wed, 30 Oct 2024 17:15:53 +0100 Subject: [PATCH 2/2] Align size of allocation to provider's page size in arena_extent_alloc() Signed-off-by: Lukasz Dorau --- src/pool/pool_jemalloc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pool/pool_jemalloc.c b/src/pool/pool_jemalloc.c index ceee16891..433276c02 100644 --- a/src/pool/pool_jemalloc.c +++ b/src/pool/pool_jemalloc.c @@ -76,6 +76,9 @@ static void *arena_extent_alloc(extent_hooks_t *extent_hooks, void *new_addr, jemalloc_memory_pool_t *pool = get_pool_by_arena_index(arena_ind); + // align a size of the allocation to the provider's page size + size = ALIGN_UP(size, pool->page_size); + void *ptr = new_addr; ret = umfMemoryProviderAlloc(pool->provider, size, alignment, &ptr); if (ret != UMF_RESULT_SUCCESS) {