Always allocate linear memory using mmap (#3052)

With this approach we can omit using memset() for the newly allocated memory
therefore the physical pages are not being used unless touched by the program.

This also simplifies the implementation.
This commit is contained in:
Marcin Kolny
2024-02-02 14:17:44 +00:00
committed by GitHub
parent 2eb60060d8
commit a27ddece7f
25 changed files with 384 additions and 425 deletions

View File

@ -0,0 +1,24 @@
/*
* Copyright (C) 2024 Amazon Inc. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#include "bh_memutils.h"
void *
bh_memory_remap_slow(void *old_addr, size_t old_size, size_t new_size)
{
void *new_memory =
os_mmap(NULL, new_size, MMAP_PROT_WRITE | MMAP_PROT_READ, 0, -1);
if (!new_memory) {
return NULL;
}
/*
* bh_memcpy_s can't be used as it doesn't support values bigger than
* UINT32_MAX
*/
memcpy(new_memory, old_addr, new_size < old_size ? new_size : old_size);
os_munmap(old_addr, old_size);
return new_memory;
}

View File

@ -0,0 +1,35 @@
/*
* Copyright (C) 2024 Amazon Inc. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _BH_MEMUTILS_H
#define _BH_MEMUTILS_H
#include "bh_platform.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Remaps memory by mapping a new region, copying data from the old
* region and umapping the old region.
*
* Unless the behavior is desired, in most cases os_mremap should be used
* as it's at worst equally slow as this function, and on some platforms
* (e.g. posix with mremap) os_mremap will perform better.
*
* @param old_addr an old address.
* @param old_size a size of the old address.
* @param new_size a size of the new memory region.
* @return a pointer to the new memory region.
*/
void *
bh_memory_remap_slow(void *old_addr, size_t old_size, size_t new_size);
#ifdef __cplusplus
}
#endif
#endif /* end of _BH_MEMUTILS_H */