From 4b0cda2012ba0088639afc899d024f4e5e0514e4 Mon Sep 17 00:00:00 2001 From: daan Date: Sun, 14 Nov 2021 11:23:11 -0800 Subject: [PATCH 1/2] take overcommit into account for eager commit delay --- include/mimalloc-internal.h | 1 + src/os.c | 6 +++++- src/segment.c | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/include/mimalloc-internal.h b/include/mimalloc-internal.h index 23078330..058acf80 100644 --- a/include/mimalloc-internal.h +++ b/include/mimalloc-internal.h @@ -72,6 +72,7 @@ void _mi_os_init(void); // called fro void* _mi_os_alloc(size_t size, mi_stats_t* stats); // to allocate thread local data void _mi_os_free(void* p, size_t size, mi_stats_t* stats); // to free thread local data size_t _mi_os_good_alloc_size(size_t size); +bool _mi_os_has_overcommit(void); // memory.c void* _mi_mem_alloc_aligned(size_t size, size_t alignment, bool* commit, bool* large, bool* is_pinned, bool* is_zero, size_t* id, mi_os_tld_t* tld); diff --git a/src/os.c b/src/os.c index 67b6c6db..ee6e92c0 100644 --- a/src/os.c +++ b/src/os.c @@ -101,6 +101,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; @@ -460,7 +464,7 @@ static void* mi_unix_mmap(void* addr, size_t size, size_t try_alignment, int pro #endif int flags = MAP_PRIVATE | MAP_ANONYMOUS; int fd = -1; - 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 6de3a8ae..424495ca 100644 --- a/src/segment.c +++ b/src/segment.c @@ -579,7 +579,9 @@ static mi_segment_t* mi_segment_init(mi_segment_t* segment, size_t required, mi_ mi_assert_internal(segment_size >= required); // Initialize parameters - const bool eager_delayed = (page_kind <= MI_PAGE_MEDIUM && _mi_current_thread_count() > 2 && + const bool eager_delayed = (page_kind <= MI_PAGE_MEDIUM && // don't delay for large objects + !_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_delayed && mi_option_is_enabled(mi_option_eager_commit); bool commit = eager; // || (page_kind >= MI_PAGE_LARGE); From f039774cf5aeb7e6f536fd29d6d26e56b433c742 Mon Sep 17 00:00:00 2001 From: daan Date: Sun, 14 Nov 2021 11:26:30 -0800 Subject: [PATCH 2/2] adjust decommit delay --- src/segment.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/segment.c b/src/segment.c index c8a8b9b1..57737099 100644 --- a/src/segment.c +++ b/src/segment.c @@ -483,7 +483,7 @@ static void mi_segment_perhaps_decommit(mi_segment_t* segment, uint8_t* p, size_ else if (segment->decommit_expire <= now) { // previous decommit mask already expired // mi_segment_delayed_decommit(segment, true, stats); - segment->decommit_expire = now + 5; // wait a tiny bit longer in case there is a series of free's + segment->decommit_expire = now + (mi_option_get(mi_option_reset_delay) / 8); // wait a tiny bit longer in case there is a series of free's } else { // previous decommit mask is not yet expired