From 5e60b2ac289f62d046cb0f15bb3fd898347404e5 Mon Sep 17 00:00:00 2001 From: K Pamnany Date: Mon, 21 Aug 2023 12:19:17 -0400 Subject: [PATCH] RAI: Disable huge pages for all mmap'ed memory Prevent transparent huge pages (THP) overallocating pysical memory. --- src/gc-pages.c | 4 ++++ src/gc-stacks.c | 3 +++ src/gc.c | 3 +++ 3 files changed, 10 insertions(+) diff --git a/src/gc-pages.c b/src/gc-pages.c index 856fabecaab98..ac6b6678fd4d8 100644 --- a/src/gc-pages.c +++ b/src/gc-pages.c @@ -74,6 +74,10 @@ static char *jl_gc_try_alloc_pages(int pg_cnt) JL_NOTSAFEPOINT return NULL; poolmem_bytes_allocated += pages_sz; poolmem_blocks_allocated_total++; + +#ifdef MADV_NOHUGEPAGE + madvise(mem, pages_sz, MADV_NOHUGEPAGE); +#endif #endif if (GC_PAGE_SZ > jl_page_size) // round data pointer up to the nearest gc_page_data-aligned diff --git a/src/gc-stacks.c b/src/gc-stacks.c index b35c1722c82ff..4c477dd3d4c17 100644 --- a/src/gc-stacks.c +++ b/src/gc-stacks.c @@ -61,6 +61,9 @@ static void *malloc_stack(size_t bufsz) JL_NOTSAFEPOINT munmap(stk, bufsz); return MAP_FAILED; } +#ifdef MADV_NOHUGEPAGE + madvise(stk, bufsz, MADV_NOHUGEPAGE); +#endif #endif jl_atomic_fetch_add(&num_stack_mappings, 1); return stk; diff --git a/src/gc.c b/src/gc.c index e9e26bb748994..ea207bbab7698 100644 --- a/src/gc.c +++ b/src/gc.c @@ -4171,6 +4171,9 @@ void *jl_gc_perm_alloc_nolock(size_t sz, int zero, unsigned align, unsigned offs errno = last_errno; if (__unlikely(pool == MAP_FAILED)) return NULL; +#ifdef MADV_NOHUGEPAGE + madvise(pool, GC_PERM_POOL_SIZE, MADV_NOHUGEPAGE); +#endif #endif gc_perm_pool = (uintptr_t)pool; gc_perm_end = gc_perm_pool + GC_PERM_POOL_SIZE;