take overcommit into account for eager commit delay

This commit is contained in:
daan 2021-11-14 11:23:11 -08:00
parent 09e59e0610
commit 4b0cda2012
3 changed files with 9 additions and 2 deletions

View file

@ -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);

View file

@ -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)

View file

@ -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);