malloc: Do not call madvise if heap's oldsize >= THP size

Linux handles virtual memory in Virtual Memory Areas (VMAs). The
madvise(MADV_HUGEPAGE) call works on a VMA granularity, which sets the
VM_HUGEPAGE flag on the VMA. This flag is invariant of the mprotect()
syscall which is used in growing the secondary heaps. Therefore, we
need to call madvise() only when we are sure that VM_HUGEPAGE was not
previously set, which is only in the case when h->size < mp_.thp_pagesize.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Dev Jain 2025-10-17 19:48:43 +05:30 committed by Adhemerval Zanella
parent c284fd5eaf
commit 6e8f32d39a
1 changed files with 4 additions and 1 deletions

View File

@ -482,7 +482,10 @@ grow_heap (heap_info *h, long diff)
h->mprotect_size = new_size;
}
madvise_thp (h, new_size);
/* mprotect preserves MADV_HUGEPAGE semantics - this means that if the old
region was marked with MADV_HUGEPAGE, the new region will retain that. */
if (h->size < mp_.thp_pagesize)
madvise_thp (h, new_size);
h->size = new_size;
LIBC_PROBE (memory_heap_more, 2, h, h->size);