diff --git a/include/mimalloc-internal.h b/include/mimalloc-internal.h index 20a26dac..e4a6b349 100644 --- a/include/mimalloc-internal.h +++ b/include/mimalloc-internal.h @@ -79,6 +79,7 @@ bool _mi_os_decommit(void* p, size_t size, mi_stats_t* stats); bool _mi_os_reset(void* p, size_t size, mi_stats_t* stats); bool _mi_os_unreset(void* p, size_t size, bool* is_zero, mi_stats_t* stats); size_t _mi_os_good_alloc_size(size_t size); +bool _mi_os_has_overcommit(void); // arena.c void* _mi_arena_alloc_aligned(size_t size, size_t alignment, bool* commit, bool* large, bool* is_pinned, bool* is_zero, size_t* memid, mi_os_tld_t* tld); diff --git a/src/os.c b/src/os.c index 31ad4119..169680a1 100644 --- a/src/os.c +++ b/src/os.c @@ -90,6 +90,10 @@ static size_t large_os_page_size = 0; // set dynamically in _mi_os_init (and if true we use MAP_NORESERVE) static bool os_overcommit = true; +bool _mi_os_has_overcommit(void) { + return os_overcommit; +} + // OS (small) page size size_t _mi_os_page_size() { return os_page_size; @@ -463,7 +467,7 @@ static void* mi_unix_mmap(void* addr, size_t size, size_t try_alignment, int pro #endif const int fd = mi_unix_mmap_fd(); int flags = MAP_PRIVATE | MAP_ANONYMOUS; - if (os_overcommit) { + if (_mi_os_has_overcommit()) { flags |= MAP_NORESERVE; } #if defined(PROT_MAX) diff --git a/src/segment.c b/src/segment.c index 03c58fdd..c8a8b9b1 100644 --- a/src/segment.c +++ b/src/segment.c @@ -714,7 +714,9 @@ static mi_segment_t* mi_segment_init(mi_segment_t* segment, size_t required, mi_ const size_t segment_size = segment_slices * MI_SEGMENT_SLICE_SIZE; // Commit eagerly only if not the first N lazy segments (to reduce impact of many threads that allocate just a little) - const bool eager_delay = (_mi_current_thread_count() > 2 && tld->count < (size_t)mi_option_get(mi_option_eager_commit_delay)); + const bool eager_delay = (!_mi_os_has_overcommit() && // never delay on overcommit systems + _mi_current_thread_count() > 2 && // do not delay for the first N threads + tld->count < (size_t)mi_option_get(mi_option_eager_commit_delay)); const bool eager = !eager_delay && mi_option_is_enabled(mi_option_eager_commit); bool commit = eager || (required > 0);