From 8607ff617c175dc4a7e436349bf6284758d5e4ea Mon Sep 17 00:00:00 2001 From: daan Date: Tue, 8 Sep 2020 17:16:31 -0700 Subject: [PATCH] add environment option mi_reserve_os_memory --- include/mimalloc.h | 1 + src/init.c | 6 +++++- src/options.c | 11 ++++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/mimalloc.h b/include/mimalloc.h index ea79a522..b980037c 100644 --- a/include/mimalloc.h +++ b/include/mimalloc.h @@ -304,6 +304,7 @@ typedef enum mi_option_e { mi_option_reset_decommits, mi_option_large_os_pages, // implies eager commit mi_option_reserve_huge_os_pages, + mi_option_reserve_os_memory, mi_option_segment_cache, mi_option_page_reset, mi_option_abandoned_page_reset, diff --git a/src/init.c b/src/init.c index 48601637..bc17791b 100644 --- a/src/init.c +++ b/src/init.c @@ -478,7 +478,11 @@ void mi_process_init(void) mi_attr_noexcept { if (mi_option_is_enabled(mi_option_reserve_huge_os_pages)) { size_t pages = mi_option_get(mi_option_reserve_huge_os_pages); mi_reserve_huge_os_pages_interleave(pages, 0, pages*500); - } + } + if (mi_option_is_enabled(mi_option_reserve_os_memory)) { + long ksize = mi_option_get(mi_option_reserve_os_memory); + if (ksize > 0) mi_reserve_os_memory((size_t)ksize*KiB, true, true); + } } // Called when the process is done (through `at_exit`) diff --git a/src/options.c b/src/options.c index 7e565ea4..2dbc8b03 100644 --- a/src/options.c +++ b/src/options.c @@ -74,7 +74,8 @@ static mi_option_desc_t options[_mi_option_last] = { 0, UNINIT, MI_OPTION(reset_decommits) }, // reset uses MADV_FREE/MADV_DONTNEED #endif { 0, UNINIT, MI_OPTION(large_os_pages) }, // use large OS pages, use only with eager commit to prevent fragmentation of VMA's - { 0, UNINIT, MI_OPTION(reserve_huge_os_pages) }, + { 0, UNINIT, MI_OPTION(reserve_huge_os_pages) }, // per 1GiB huge pages + { 0, UNINIT, MI_OPTION(reserve_os_memory) }, { 0, UNINIT, MI_OPTION(segment_cache) }, // cache N segments per thread { 1, UNINIT, MI_OPTION(page_reset) }, // reset page memory on free { 0, UNINIT, MI_OPTION(abandoned_page_reset) },// reset free page memory when a thread terminates @@ -504,6 +505,14 @@ static void mi_option_init(mi_option_desc_t* desc) { else { char* end = buf; long value = strtol(buf, &end, 10); + if (desc->option == mi_option_reserve_os_memory) { + // this option is interpreted in KiB to prevent overflow of `long` + if (*end == 'K') { end++; } + else if (*end == 'M') { value *= KiB; end++; } + else if (*end == 'G') { value *= MiB; end++; } + else { value = (value + KiB - 1) / KiB; } + if (*end == 'B') { end++; } + } if (*end == 0) { desc->value = value; desc->init = INITIALIZED;