From e274d83c1c6b05b4110d9aaa2bab356844522455 Mon Sep 17 00:00:00 2001 From: "Dongsheng.Yan" Date: Mon, 8 Apr 2024 14:49:44 +0800 Subject: [PATCH 1/9] use WASM_MEM_ALLOC_WITH_USAGE option define custom allocator which could know the memory's usage is for linear memory or not --- build-scripts/config_common.cmake | 3 ++ core/config.h | 4 +++ core/iwasm/common/wasm_memory.c | 38 ++++++++++++++++++--- core/iwasm/include/wasm_export.h | 5 +++ product-mini/platforms/linux/CMakeLists.txt | 5 +++ product-mini/platforms/posix/main.c | 15 ++++++-- 6 files changed, 63 insertions(+), 7 deletions(-) diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index 8422b060bd..978670a8ee 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -554,3 +554,6 @@ else () # Disable aot intrinsics for interp, fast-jit and llvm-jit add_definitions (-DWASM_ENABLE_AOT_INTRINSICS=0) endif () +if (WAMR_MEM_ALLOC_WITH_USAGE EQUAL 1) + add_definitions(-DWASM_MEM_ALLOC_WITH_USAGE=1) +endif() diff --git a/core/config.h b/core/config.h index d84ed3f360..c8ccc07a26 100644 --- a/core/config.h +++ b/core/config.h @@ -587,4 +587,8 @@ #define WASM_TABLE_MAX_SIZE 1024 #endif +#ifndef WASM_MEM_ALLOC_WITH_USAGE +#define WASM_MEM_ALLOC_WITH_USAGE 0 +#endif + #endif /* end of _CONFIG_H_ */ diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index 50ee917ed1..a07c37669b 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -27,7 +27,12 @@ static mem_allocator_t pool_allocator = NULL; static enlarge_memory_error_callback_t enlarge_memory_error_cb; static void *enlarge_memory_error_user_data; -#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 +#if WASM_MEM_ALLOC_WITH_USAGE != 0 +static void *(*malloc_func)(mem_alloc_usage_t usage, unsigned int size) = NULL; +static void *(*realloc_func)(mem_alloc_usage_t usage, void *ptr, + unsigned int size) = NULL; +static void (*free_func)(mem_alloc_usage_t usage, void *ptr) = NULL; +#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 static void *allocator_user_data = NULL; static void *(*malloc_func)(void *user_data, unsigned int size) = NULL; static void *(*realloc_func)(void *user_data, void *ptr, @@ -177,7 +182,9 @@ wasm_runtime_malloc_internal(unsigned int size) return mem_allocator_malloc(pool_allocator, size); } else if (memory_mode == MEMORY_MODE_ALLOCATOR) { -#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + return malloc_func(Alloc_For_Runtime, size); +#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 return malloc_func(allocator_user_data, size); #else return malloc_func(size); @@ -201,7 +208,9 @@ wasm_runtime_realloc_internal(void *ptr, unsigned int size) } else if (memory_mode == MEMORY_MODE_ALLOCATOR) { if (realloc_func) -#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + return realloc_func(Alloc_For_Runtime, ptr, size); +#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 return realloc_func(allocator_user_data, ptr, size); #else return realloc_func(ptr, size); @@ -233,7 +242,9 @@ wasm_runtime_free_internal(void *ptr) mem_allocator_free(pool_allocator, ptr); } else if (memory_mode == MEMORY_MODE_ALLOCATOR) { -#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + free_func(Alloc_For_Runtime, ptr); +#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 free_func(allocator_user_data, ptr); #else free_func(ptr); @@ -796,6 +807,12 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count) } } +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + if (!(memory_data_new = realloc_func(Alloc_For_LinearMemory, memory_data_old, total_size_new))) { + ret = false; + goto return_func; + } +#else if (!(memory_data_new = wasm_mremap_linear_memory(memory_data_old, total_size_old, total_size_new, total_size_new))) { @@ -803,6 +820,7 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count) goto return_func; } +#endif if (heap_size > 0) { if (mem_allocator_migrate(memory->heap_handle, (char *)heap_data_old @@ -903,8 +921,14 @@ wasm_deallocate_linear_memory(WASMMemoryInstance *memory_inst) #else map_size = 8 * (uint64)BH_GB; #endif + +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + free_func(Alloc_For_LinearMemory, memory_inst->memory_data); +#else wasm_munmap_linear_memory(memory_inst->memory_data, memory_inst->memory_data_size, map_size); +#endif + memory_inst->memory_data = NULL; } @@ -954,9 +978,15 @@ wasm_allocate_linear_memory(uint8 **data, bool is_shared_memory, *memory_data_size = align_as_and_cast(*memory_data_size, page_size); if (map_size > 0) { +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + if (!(*data = malloc_func(Alloc_For_LinearMemory, *memory_data_size))) { + return BHT_ERROR; + } +#else if (!(*data = wasm_mmap_linear_memory(map_size, *memory_data_size))) { return BHT_ERROR; } +#endif } return BHT_OK; diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h index e40e948852..1ed384e4bd 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h @@ -107,6 +107,11 @@ typedef enum { Alloc_With_System_Allocator, } mem_alloc_type_t; +typedef enum { + Alloc_For_Runtime, + Alloc_For_LinearMemory +} mem_alloc_usage_t; + /* Memory allocator option */ typedef union MemAllocOption { struct { diff --git a/product-mini/platforms/linux/CMakeLists.txt b/product-mini/platforms/linux/CMakeLists.txt index df156b3a06..3cf49b3b72 100644 --- a/product-mini/platforms/linux/CMakeLists.txt +++ b/product-mini/platforms/linux/CMakeLists.txt @@ -123,6 +123,11 @@ if (WAMR_BUILD_DEBUG_INTERP EQUAL 1) set (WAMR_BUILD_SIMD 0) endif () +if (NOT DEFINED WAMR_MEM_ALLOC_WITH_USAGE) + # Disable Debug feature by default + set (WAMR_MEM_ALLOC_WITH_USAGE 1) +endif () + set (WAMR_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..) include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) diff --git a/product-mini/platforms/posix/main.c b/product-mini/platforms/posix/main.c index 2acd2190a4..92e3066a09 100644 --- a/product-mini/platforms/posix/main.c +++ b/product-mini/platforms/posix/main.c @@ -445,31 +445,40 @@ static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE] = { 0 }; #else static void * malloc_func( -#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, +#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif unsigned int size) { + //printf("current allocated for %d\n", usage); return malloc(size); } static void * realloc_func( -#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, +#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif void *ptr, unsigned int size) { + //printf("current realloc for %d\n", usage); return realloc(ptr, size); } static void free_func( -#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, +#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif void *ptr) { + //printf("current free for %d\n", usage); free(ptr); } #endif /* end of WASM_ENABLE_GLOBAL_HEAP_POOL */ From bcb5cde2af0b90a94dcebca931b4e19e9bb389a7 Mon Sep 17 00:00:00 2001 From: "Dongsheng.Yan" Date: Mon, 15 Apr 2024 09:07:45 +0800 Subject: [PATCH 2/9] use realloc_func to enlarge memory use realloc_func to enlarge memory --- core/iwasm/common/wasm_memory.c | 24 +++++++++++++++++------- product-mini/platforms/posix/main.c | 3 --- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index a07c37669b..709c88471a 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -776,6 +776,18 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count) bh_assert(total_size_new <= GET_MAX_LINEAR_MEMORY_SIZE(memory->is_memory64)); +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + (void)full_size_mmaped; + if (!(memory_data_new = realloc_func(Alloc_For_LinearMemory, + memory_data_old, + total_size_new))) { + ret = false; + goto return_func; + } + memory->heap_data = memory_data_new + (heap_data_old - memory_data_old); + memory->heap_data_end = memory->heap_data + heap_size; + memory->memory_data = memory_data_new; +#else if (full_size_mmaped) { #ifdef BH_PLATFORM_WINDOWS if (!os_mem_commit(memory->memory_data_end, @@ -807,12 +819,6 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count) } } -#if WASM_MEM_ALLOC_WITH_USAGE != 0 - if (!(memory_data_new = realloc_func(Alloc_For_LinearMemory, memory_data_old, total_size_new))) { - ret = false; - goto return_func; - } -#else if (!(memory_data_new = wasm_mremap_linear_memory(memory_data_old, total_size_old, total_size_new, total_size_new))) { @@ -820,7 +826,7 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count) goto return_func; } -#endif +# if (heap_size > 0) { if (mem_allocator_migrate(memory->heap_handle, (char *)heap_data_old @@ -841,6 +847,7 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count) os_writegsbase(memory_data_new); #endif } +#endif /* end of WASM_MEM_ALLOC_WITH_USAGE */ memory->num_bytes_per_page = num_bytes_per_page; memory->cur_page_count = total_page_count; @@ -923,6 +930,7 @@ wasm_deallocate_linear_memory(WASMMemoryInstance *memory_inst) #endif #if WASM_MEM_ALLOC_WITH_USAGE != 0 + (void)map_size; free_func(Alloc_For_LinearMemory, memory_inst->memory_data); #else wasm_munmap_linear_memory(memory_inst->memory_data, @@ -961,6 +969,7 @@ wasm_allocate_linear_memory(uint8 **data, bool is_shared_memory, * so the range of ea is 0 to 8G */ map_size = 8 * (uint64)BH_GB; + #endif /* end of OS_ENABLE_HW_BOUND_CHECK */ page_size = os_getpagesize(); @@ -979,6 +988,7 @@ wasm_allocate_linear_memory(uint8 **data, bool is_shared_memory, if (map_size > 0) { #if WASM_MEM_ALLOC_WITH_USAGE != 0 + (void)wasm_mmap_linear_memory; if (!(*data = malloc_func(Alloc_For_LinearMemory, *memory_data_size))) { return BHT_ERROR; } diff --git a/product-mini/platforms/posix/main.c b/product-mini/platforms/posix/main.c index 92e3066a09..250de19b46 100644 --- a/product-mini/platforms/posix/main.c +++ b/product-mini/platforms/posix/main.c @@ -452,7 +452,6 @@ malloc_func( #endif unsigned int size) { - //printf("current allocated for %d\n", usage); return malloc(size); } @@ -465,7 +464,6 @@ realloc_func( #endif void *ptr, unsigned int size) { - //printf("current realloc for %d\n", usage); return realloc(ptr, size); } @@ -478,7 +476,6 @@ free_func( #endif void *ptr) { - //printf("current free for %d\n", usage); free(ptr); } #endif /* end of WASM_ENABLE_GLOBAL_HEAP_POOL */ From 9d01595a7059313ab0a48e78e7ac29d3ceefa8fa Mon Sep 17 00:00:00 2001 From: "Dongsheng.Yan" Date: Mon, 15 Apr 2024 09:30:43 +0800 Subject: [PATCH 3/9] move the CONFIG_WAMR_MEM_ALLOC_WITH_USAGE in nuttx move the CONFIG_WAMR_MEM_ALLOC_WITH_USAGE in nuttx --- core/iwasm/common/wasm_memory.c | 2 -- product-mini/platforms/linux/CMakeLists.txt | 5 ----- product-mini/platforms/nuttx/CMakeLists.txt | 4 ++++ 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index 709c88471a..4dc14e273a 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -826,7 +826,6 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count) goto return_func; } -# if (heap_size > 0) { if (mem_allocator_migrate(memory->heap_handle, (char *)heap_data_old @@ -969,7 +968,6 @@ wasm_allocate_linear_memory(uint8 **data, bool is_shared_memory, * so the range of ea is 0 to 8G */ map_size = 8 * (uint64)BH_GB; - #endif /* end of OS_ENABLE_HW_BOUND_CHECK */ page_size = os_getpagesize(); diff --git a/product-mini/platforms/linux/CMakeLists.txt b/product-mini/platforms/linux/CMakeLists.txt index 3cf49b3b72..df156b3a06 100644 --- a/product-mini/platforms/linux/CMakeLists.txt +++ b/product-mini/platforms/linux/CMakeLists.txt @@ -123,11 +123,6 @@ if (WAMR_BUILD_DEBUG_INTERP EQUAL 1) set (WAMR_BUILD_SIMD 0) endif () -if (NOT DEFINED WAMR_MEM_ALLOC_WITH_USAGE) - # Disable Debug feature by default - set (WAMR_MEM_ALLOC_WITH_USAGE 1) -endif () - set (WAMR_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..) include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) diff --git a/product-mini/platforms/nuttx/CMakeLists.txt b/product-mini/platforms/nuttx/CMakeLists.txt index f83e799162..64d6429a21 100644 --- a/product-mini/platforms/nuttx/CMakeLists.txt +++ b/product-mini/platforms/nuttx/CMakeLists.txt @@ -185,6 +185,10 @@ if(CONFIG_INTERPRETERS_WAMR_LIB_PTHREAD) set(WAMR_BUILD_LIB_PTHREAD 1) endif() +if (CONFIG_WAMR_MEM_ALLOC_WITH_USAGE) + set (WAMR_MEM_ALLOC_WITH_USAGE 1) +endif () + set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..) # enable WAMR build system From 468aa431914dfe2113e6a8d4ff147388e6ded720 Mon Sep 17 00:00:00 2001 From: "Dongsheng.Yan" Date: Mon, 15 Apr 2024 09:41:46 +0800 Subject: [PATCH 4/9] clang format the code clang format the code --- core/iwasm/common/wasm_memory.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index 4dc14e273a..805cb453c0 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -777,16 +777,15 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count) <= GET_MAX_LINEAR_MEMORY_SIZE(memory->is_memory64)); #if WASM_MEM_ALLOC_WITH_USAGE != 0 - (void)full_size_mmaped; - if (!(memory_data_new = realloc_func(Alloc_For_LinearMemory, - memory_data_old, - total_size_new))) { - ret = false; - goto return_func; - } - memory->heap_data = memory_data_new + (heap_data_old - memory_data_old); - memory->heap_data_end = memory->heap_data + heap_size; - memory->memory_data = memory_data_new; + (void)full_size_mmaped; + if (!(memory_data_new = realloc_func(Alloc_For_LinearMemory, + memory_data_old, total_size_new))) { + ret = false; + goto return_func; + } + memory->heap_data = memory_data_new + (heap_data_old - memory_data_old); + memory->heap_data_end = memory->heap_data + heap_size; + memory->memory_data = memory_data_new; #else if (full_size_mmaped) { #ifdef BH_PLATFORM_WINDOWS @@ -929,8 +928,8 @@ wasm_deallocate_linear_memory(WASMMemoryInstance *memory_inst) #endif #if WASM_MEM_ALLOC_WITH_USAGE != 0 - (void)map_size; - free_func(Alloc_For_LinearMemory, memory_inst->memory_data); + (void)map_size; + free_func(Alloc_For_LinearMemory, memory_inst->memory_data); #else wasm_munmap_linear_memory(memory_inst->memory_data, memory_inst->memory_data_size, map_size); From 20debc26e7d27186abea29a00789b0c35bd1d6a7 Mon Sep 17 00:00:00 2001 From: HongxiaWangSSSS Date: Mon, 15 Apr 2024 09:59:39 +0800 Subject: [PATCH 5/9] add WAMR_MEM_ALLOC_WITH_USAGE on nuttx platform --- product-mini/platforms/nuttx/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/product-mini/platforms/nuttx/CMakeLists.txt b/product-mini/platforms/nuttx/CMakeLists.txt index f83e799162..8296ef37ed 100644 --- a/product-mini/platforms/nuttx/CMakeLists.txt +++ b/product-mini/platforms/nuttx/CMakeLists.txt @@ -129,6 +129,10 @@ if(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL) set(WAMR_BUILD_GLOBAL_HEAP_SIZE ${_HEAP_SIZE_}) endif() +if (CONFIG_INTERPRETERS_WAMR_MEM_ALLOC_WITH_USAGE EQUAL 1) + set(WAMR_MEM_ALLOC_WITH_USAGE 1) +endif() + if(CONFIG_INTERPRETERS_WAMR_ENABLE_SPEC_TEST) set(WAMR_BUILD_SPEC_TEST 1) endif() From 888108264e971b063d1ad5d94dca777a6a2726c7 Mon Sep 17 00:00:00 2001 From: HongxiaWangSSSS Date: Mon, 15 Apr 2024 10:12:08 +0800 Subject: [PATCH 6/9] revert incorrect string definition --- product-mini/platforms/nuttx/CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/product-mini/platforms/nuttx/CMakeLists.txt b/product-mini/platforms/nuttx/CMakeLists.txt index 4c542d34d0..8296ef37ed 100644 --- a/product-mini/platforms/nuttx/CMakeLists.txt +++ b/product-mini/platforms/nuttx/CMakeLists.txt @@ -189,10 +189,6 @@ if(CONFIG_INTERPRETERS_WAMR_LIB_PTHREAD) set(WAMR_BUILD_LIB_PTHREAD 1) endif() -if (CONFIG_WAMR_MEM_ALLOC_WITH_USAGE) - set (WAMR_MEM_ALLOC_WITH_USAGE 1) -endif () - set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..) # enable WAMR build system From 21ca53451dcaa1514708b7da0ed8b0f22aa3ad9e Mon Sep 17 00:00:00 2001 From: HongxiaWangSSSS Date: Mon, 15 Apr 2024 14:13:26 +0800 Subject: [PATCH 7/9] rename WAMR_MEM_ALLOC_WITH_USAGE to WAMR_BUILD_MEM_ALLOC_WITH_USAGE --- build-scripts/config_common.cmake | 2 +- product-mini/platforms/nuttx/CMakeLists.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index 978670a8ee..d73db1272c 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -554,6 +554,6 @@ else () # Disable aot intrinsics for interp, fast-jit and llvm-jit add_definitions (-DWASM_ENABLE_AOT_INTRINSICS=0) endif () -if (WAMR_MEM_ALLOC_WITH_USAGE EQUAL 1) +if (WAMR_BUILD_MEM_ALLOC_WITH_USAGE EQUAL 1) add_definitions(-DWASM_MEM_ALLOC_WITH_USAGE=1) endif() diff --git a/product-mini/platforms/nuttx/CMakeLists.txt b/product-mini/platforms/nuttx/CMakeLists.txt index 8296ef37ed..e9fe5a9e3a 100644 --- a/product-mini/platforms/nuttx/CMakeLists.txt +++ b/product-mini/platforms/nuttx/CMakeLists.txt @@ -129,8 +129,8 @@ if(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL) set(WAMR_BUILD_GLOBAL_HEAP_SIZE ${_HEAP_SIZE_}) endif() -if (CONFIG_INTERPRETERS_WAMR_MEM_ALLOC_WITH_USAGE EQUAL 1) - set(WAMR_MEM_ALLOC_WITH_USAGE 1) +if (CONFIG_INTERPRETERS_WAMR_MEM_ALLOC_WITH_USAGE) + set(WAMR_BUILD_MEM_ALLOC_WITH_USAGE 1) endif() if(CONFIG_INTERPRETERS_WAMR_ENABLE_SPEC_TEST) From 1ec2f5b264bbf337285eb19e079745234952fe69 Mon Sep 17 00:00:00 2001 From: HongxiaWangSSSS Date: Wed, 17 Apr 2024 12:02:55 +0800 Subject: [PATCH 8/9] add WASM_MEM_ALLOC_WITH_USAGE in wamr.mk --- product-mini/platforms/nuttx/wamr.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/product-mini/platforms/nuttx/wamr.mk b/product-mini/platforms/nuttx/wamr.mk index e414a7cdab..7aac0e358b 100644 --- a/product-mini/platforms/nuttx/wamr.mk +++ b/product-mini/platforms/nuttx/wamr.mk @@ -373,6 +373,11 @@ CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=1 CFLAGS += -DWASM_GLOBAL_HEAP_SIZE="$(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL_SIZE) * 1024" else CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=0 +ifeq ($(CONFIG_INTERPRETERS_WAMR_MEM_ALLOC_WITH_USAGE),y) +CFLAGS += -DWASM_MEM_ALLOC_WITH_USAGE=1 +else +CFLAGS += -DWASM_MEM_ALLOC_WITH_USAGE=0 +endif endif ifeq ($(CONFIG_INTERPRETERS_WAMR_ENABLE_SPEC_TEST),y) From 25c78af6b3c3b68bcd592816b1da4c038589682c Mon Sep 17 00:00:00 2001 From: "Dongsheng.Yan" Date: Thu, 18 Apr 2024 11:13:43 +0800 Subject: [PATCH 9/9] update following the reivew comments 1, WAMR_BUILD_MEM_ALLOC_WITH_USAGE -> WAMR_BUILD_ALLOC_WITH_USAGE 2, redefine the malloc, free, realloc signature. 3, let customer handle full_size_mmaped also in its realloc. 4, update the doc --- build-scripts/config_common.cmake | 2 +- core/iwasm/common/wasm_memory.c | 105 +++++++++++++++++++--------- core/iwasm/include/wasm_export.h | 3 + doc/build_wamr.md | 4 ++ product-mini/platforms/posix/main.c | 11 +-- 5 files changed, 86 insertions(+), 39 deletions(-) diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index d73db1272c..d428302fad 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -554,6 +554,6 @@ else () # Disable aot intrinsics for interp, fast-jit and llvm-jit add_definitions (-DWASM_ENABLE_AOT_INTRINSICS=0) endif () -if (WAMR_BUILD_MEM_ALLOC_WITH_USAGE EQUAL 1) +if (WAMR_BUILD_ALLOC_WITH_USAGE EQUAL 1) add_definitions(-DWASM_MEM_ALLOC_WITH_USAGE=1) endif() diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index 805cb453c0..c49c1825a9 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -27,23 +27,37 @@ static mem_allocator_t pool_allocator = NULL; static enlarge_memory_error_callback_t enlarge_memory_error_cb; static void *enlarge_memory_error_user_data; -#if WASM_MEM_ALLOC_WITH_USAGE != 0 -static void *(*malloc_func)(mem_alloc_usage_t usage, unsigned int size) = NULL; -static void *(*realloc_func)(mem_alloc_usage_t usage, void *ptr, - unsigned int size) = NULL; -static void (*free_func)(mem_alloc_usage_t usage, void *ptr) = NULL; -#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 static void *allocator_user_data = NULL; -static void *(*malloc_func)(void *user_data, unsigned int size) = NULL; -static void *(*realloc_func)(void *user_data, void *ptr, - unsigned int size) = NULL; -static void (*free_func)(void *user_data, void *ptr) = NULL; -#else -static void *(*malloc_func)(unsigned int size) = NULL; -static void *(*realloc_func)(void *ptr, unsigned int size) = NULL; -static void (*free_func)(void *ptr) = NULL; #endif +static void *(*malloc_func)( +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, +#endif +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 + void *user_data, +#endif + unsigned int size) = NULL; + +static void *(*realloc_func)( +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, bool full_size_mmaped, +#endif +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 + void *user_data, +#endif + void *ptr, unsigned int size) = NULL; + +static void (*free_func)( +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, +#endif +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 + void *user_data, +#endif + void *ptr) = NULL; + static unsigned int global_pool_size; static uint64 @@ -182,13 +196,14 @@ wasm_runtime_malloc_internal(unsigned int size) return mem_allocator_malloc(pool_allocator, size); } else if (memory_mode == MEMORY_MODE_ALLOCATOR) { + return malloc_func( #if WASM_MEM_ALLOC_WITH_USAGE != 0 - return malloc_func(Alloc_For_Runtime, size); -#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 - return malloc_func(allocator_user_data, size); -#else - return malloc_func(size); + Alloc_For_Runtime, #endif +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 + allocator_user_data, +#endif + size); } else { return os_malloc(size); @@ -208,13 +223,14 @@ wasm_runtime_realloc_internal(void *ptr, unsigned int size) } else if (memory_mode == MEMORY_MODE_ALLOCATOR) { if (realloc_func) + return realloc_func( #if WASM_MEM_ALLOC_WITH_USAGE != 0 - return realloc_func(Alloc_For_Runtime, ptr, size); -#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 - return realloc_func(allocator_user_data, ptr, size); -#else - return realloc_func(ptr, size); + Alloc_For_Runtime, false, +#endif +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 + allocator_user_data, #endif + ptr, size); else return NULL; } @@ -242,13 +258,14 @@ wasm_runtime_free_internal(void *ptr) mem_allocator_free(pool_allocator, ptr); } else if (memory_mode == MEMORY_MODE_ALLOCATOR) { + free_func( #if WASM_MEM_ALLOC_WITH_USAGE != 0 - free_func(Alloc_For_Runtime, ptr); -#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 - free_func(allocator_user_data, ptr); -#else - free_func(ptr); + Alloc_For_Runtime, +#endif +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 + allocator_user_data, #endif + ptr); } else { os_free(ptr); @@ -777,12 +794,24 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count) <= GET_MAX_LINEAR_MEMORY_SIZE(memory->is_memory64)); #if WASM_MEM_ALLOC_WITH_USAGE != 0 - (void)full_size_mmaped; - if (!(memory_data_new = realloc_func(Alloc_For_LinearMemory, - memory_data_old, total_size_new))) { + if (!(memory_data_new = + realloc_func(Alloc_For_LinearMemory, full_size_mmaped, +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 + NULL, +#endif + memory_data_old, total_size_new))) { ret = false; goto return_func; } + if (heap_size > 0) { + if (mem_allocator_migrate(memory->heap_handle, + (char *)heap_data_old + + (memory_data_new - memory_data_old), + heap_size) + != 0) { + ret = false; + } + } memory->heap_data = memory_data_new + (heap_data_old - memory_data_old); memory->heap_data_end = memory->heap_data + heap_size; memory->memory_data = memory_data_new; @@ -929,7 +958,11 @@ wasm_deallocate_linear_memory(WASMMemoryInstance *memory_inst) #if WASM_MEM_ALLOC_WITH_USAGE != 0 (void)map_size; - free_func(Alloc_For_LinearMemory, memory_inst->memory_data); + free_func(Alloc_For_LinearMemory, +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 + NULL, +#endif + memory_inst->memory_data); #else wasm_munmap_linear_memory(memory_inst->memory_data, memory_inst->memory_data_size, map_size); @@ -986,7 +1019,11 @@ wasm_allocate_linear_memory(uint8 **data, bool is_shared_memory, if (map_size > 0) { #if WASM_MEM_ALLOC_WITH_USAGE != 0 (void)wasm_mmap_linear_memory; - if (!(*data = malloc_func(Alloc_For_LinearMemory, *memory_data_size))) { + if (!(*data = malloc_func(Alloc_For_LinearMemory, +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 + NULL, +#endif + *memory_data_size))) { return BHT_ERROR; } #else diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h index 1ed384e4bd..45aacacaa5 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h @@ -119,6 +119,9 @@ typedef union MemAllocOption { uint32_t heap_size; } pool; struct { + /* the function signature is varied when + WASM_MEM_ALLOC_WITH_USER_DATA and + WASM_MEM_ALLOC_WITH_USAGE are defined */ void *malloc_func; void *realloc_func; void *free_func; diff --git a/doc/build_wamr.md b/doc/build_wamr.md index b0a8ea35f6..5598ea3641 100644 --- a/doc/build_wamr.md +++ b/doc/build_wamr.md @@ -254,6 +254,10 @@ Currently we only profile the memory consumption of module, module_instance and > See [Enable segue optimization for wamrc when generating the aot file](./perf_tune.md#3-enable-segue-optimization-for-wamrc-when-generating-the-aot-file) for more details. +#### **User defined linear memory allocator** +- **WAMR_BUILD_ALLOC_WITH_USAGE**=1/0, default to disable if not set +> Notes: by default, the linear memory is allocated by system. when it's set to 1 and Alloc_With_Allocator is selected, it will be allocated by customer. + #### **Enable running PGO(Profile-Guided Optimization) instrumented AOT file** - **WAMR_BUILD_STATIC_PGO**=1/0, default to disable if not set > Note: See [Use the AOT static PGO method](./perf_tune.md#5-use-the-aot-static-pgo-method) for more details. diff --git a/product-mini/platforms/posix/main.c b/product-mini/platforms/posix/main.c index 250de19b46..cb0581ce29 100644 --- a/product-mini/platforms/posix/main.c +++ b/product-mini/platforms/posix/main.c @@ -447,7 +447,8 @@ static void * malloc_func( #if WASM_MEM_ALLOC_WITH_USAGE != 0 mem_alloc_usage_t usage, -#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 +#endif +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif unsigned int size) @@ -458,8 +459,9 @@ malloc_func( static void * realloc_func( #if WASM_MEM_ALLOC_WITH_USAGE != 0 - mem_alloc_usage_t usage, -#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 + mem_alloc_usage_t usage, bool full_size_mmaped, +#endif +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif void *ptr, unsigned int size) @@ -471,7 +473,8 @@ static void free_func( #if WASM_MEM_ALLOC_WITH_USAGE != 0 mem_alloc_usage_t usage, -#elif WASM_MEM_ALLOC_WITH_USER_DATA != 0 +#endif +#if WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif void *ptr)