From 1566ff1606e1d35d897b866ac25560c6acddd50f Mon Sep 17 00:00:00 2001 From: TL Date: Sun, 26 Jan 2025 11:11:40 +0800 Subject: [PATCH] first draft of shared heap enhancement in interpreter and runtime: update interpreter --- core/iwasm/common/wasm_memory.c | 2 +- core/iwasm/interpreter/wasm_interp_classic.c | 14 +++--- core/iwasm/interpreter/wasm_interp_fast.c | 45 ++++++++++++++------ core/iwasm/interpreter/wasm_runtime.h | 9 ++++ 4 files changed, 48 insertions(+), 22 deletions(-) diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index 49df9acfb..d3d7e2a51 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -504,7 +504,7 @@ is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, for (cur = heap; cur; cur = cur->chain_next) { shared_heap_start = - cur->start_off_mem64 ? is_memory64 : cur->start_off_mem32; + is_memory64 ? cur->start_off_mem64 : cur->start_off_mem32; shared_heap_end = shared_heap_start + cur->size; if (app_offset >= shared_heap_start && app_offset <= shared_heap_end) { if (target_heap) diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c index e45a4a18f..d75fc55e7 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -53,15 +53,18 @@ typedef float64 CellType_F64; #else #define is_default_memory true #endif -#if WASM_ENABLE_MEMORY64 +#if WASM_ENABLE_MEMORY64 != 0 #define get_shared_heap_start_off(shared_heap) \ (is_memory64 ? shared_heap->start_off_mem64 : shared_heap->start_off_mem32) #else #define get_shared_heap_start_off(shared_heap) (shared_heap->start_off_mem32) #endif +/* Check whether the app addr in the last visited shared heap, if not, check the + * shared heap chain to find which(if any) shared heap the app addr in, and + * update the last visited shared heap info if found. */ #define app_addr_in_shared_heap(app_addr, bytes) \ (shared_heap && is_default_memory && (app_addr) >= shared_heap_start_off \ - && (app_addr) <= shared_heap_end_off - bytes + 0) \ + && (app_addr) <= shared_heap_end_off - bytes + 1) \ || ({ \ bool in_chain = false; \ WASMSharedHeap *cur; \ @@ -71,7 +74,7 @@ typedef float64 CellType_F64; cur_shared_heap_end_off = \ cur_shared_heap_start_off + cur->size - 1; \ if ((app_addr) >= cur_shared_heap_start_off \ - && (app_addr) <= cur_shared_heap_end_off - bytes + 0) { \ + && (app_addr) <= cur_shared_heap_end_off - bytes + 1) { \ shared_heap_start_off = cur_shared_heap_start_off; \ shared_heap_end_off = cur_shared_heap_end_off; \ shared_heap_base_addr = cur->base_addr; \ @@ -1716,10 +1719,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, goto got_exception; } - HANDLE_OP(WASM_OP_NOP) - { - HANDLE_OP_END(); - } + HANDLE_OP(WASM_OP_NOP) { HANDLE_OP_END(); } #if WASM_ENABLE_EXCE_HANDLING != 0 HANDLE_OP(WASM_OP_RETHROW) diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c index 359a6979c..3a9715a66 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c @@ -38,9 +38,33 @@ typedef float64 CellType_F64; #endif #if WASM_ENABLE_SHARED_HEAP != 0 -#define app_addr_in_shared_heap(app_addr, bytes) \ - (shared_heap && (app_addr) >= shared_heap_start_off \ - && (app_addr) <= shared_heap_end_off - bytes + 1) +/* TODO: add code for 64 bit version when memory64 is enabled for fast-interp */ +#define get_shared_heap_start_off(shared_heap) (shared_heap->start_off_mem32) +/* Check whether the app addr in the last visited shared heap, if not, check the + * shared heap chain to find which(if any) shared heap the app addr in, and + * update the last visited shared heap info if found. */ +#define app_addr_in_shared_heap(app_addr, bytes) \ + (shared_heap && (app_addr) >= shared_heap_start_off \ + && (app_addr) <= shared_heap_end_off - bytes + 1) \ + || ({ \ + bool in_chain = false; \ + WASMSharedHeap *cur; \ + uint64 cur_shared_heap_start_off, cur_shared_heap_end_off; \ + for (cur = shared_heap; cur; cur = cur->chain_next) { \ + cur_shared_heap_start_off = get_shared_heap_start_off(cur); \ + cur_shared_heap_end_off = \ + cur_shared_heap_start_off + cur->size - 1; \ + if ((app_addr) >= cur_shared_heap_start_off \ + && (app_addr) <= cur_shared_heap_end_off - bytes + 1) { \ + shared_heap_start_off = cur_shared_heap_start_off; \ + shared_heap_end_off = cur_shared_heap_end_off; \ + shared_heap_base_addr = cur->base_addr; \ + in_chain = true; \ + break; \ + } \ + } \ + in_chain; \ + }) #define shared_heap_addr_app_to_native(app_addr, native_addr) \ native_addr = shared_heap_base_addr + ((app_addr)-shared_heap_start_off) @@ -1540,19 +1564,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, #if WASM_ENABLE_SHARED_HEAP != 0 WASMSharedHeap *shared_heap = module->e ? module->e->shared_heap : NULL; uint8 *shared_heap_base_addr = shared_heap ? shared_heap->base_addr : NULL; - /* -#if WASM_ENABLE_MEMORY64 != 0 uint64 shared_heap_start_off = - shared_heap ? (is_memory64 ? shared_heap->start_off_mem64 - : shared_heap->start_off_mem32) - : 0; + shared_heap ? get_shared_heap_start_off(shared_heap) : 0; uint64 shared_heap_end_off = - shared_heap ? (is_memory64 ? UINT64_MAX : UINT32_MAX) : 0; -#else - */ /* TODO: uncomment the code when memory64 is enabled for fast-interp */ - uint64 shared_heap_start_off = - shared_heap ? shared_heap->start_off_mem32 : 0; - uint64 shared_heap_end_off = shared_heap ? UINT32_MAX : 0; + shared_heap + ? (get_shared_heap_start_off(shared_heap) + shared_heap->size - 1) + : 0; /* #endif */ #endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */ diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h index 00e9ad107..b9d49ec22 100644 --- a/core/iwasm/interpreter/wasm_runtime.h +++ b/core/iwasm/interpreter/wasm_runtime.h @@ -93,12 +93,21 @@ typedef union { } MemBound; typedef struct WASMSharedHeap { + /* The global shared heap list maintained in runtime, used for runtime + * destroy */ struct WASMSharedHeap *next; + /* The logical shared heap chain the shared heap in */ + struct WASMSharedHeap *chain_next; + /* Will be null if shared heap is created from pre allocated memory chunk + * and don't need to dynamic malloc and free */ void *heap_handle; uint8 *base_addr; uint64 size; uint64 start_off_mem64; uint64 start_off_mem32; + /* The number of wasm apps it attached to, for a shared heap chain, only the + * list head need to maintain the valid attached_count */ + uint8 attached_count; } WASMSharedHeap; struct WASMMemoryInstance {