[PATCH] malloc: Enable THP always support on hugetlb tunable
William Hunt
william.hunt@arm.com
Tue Jul 8 15:10:26 GMT 2025
Enable support for THP always when glibc.malloc.hugetlb=1, as the tunable
currently only gives explicit support in malloc for the THP madvise mode
by aligning to a huge page size. Add a thp_mode parameter to mp_ and check
in madvise_thp whether the system is using madvise mode, otherwise the
__madvise call is useless. Set the thp_mode to be unsupported by default,
but if the hugetlb tunable is set this updates thp_mode. Performance of
xalancbmk improves by 4.9% on Neoverse V2 when THP always mode is set on the
system and glibc.malloc.hugetlb=1.
Passed regress, OK for commit?
---
malloc/malloc.c | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 6da40ad602..e40c6c6cb0 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -1871,6 +1871,7 @@ struct malloc_par
INTERNAL_SIZE_T arena_max;
/* Transparent Large Page support. */
+ enum malloc_thp_mode_t thp_mode;
INTERNAL_SIZE_T thp_pagesize;
/* A value different than 0 means to align mmap allocation to hp_pagesize
add hp_flags on flags. */
@@ -1927,7 +1928,8 @@ static struct malloc_par mp_ =
.mmap_threshold = DEFAULT_MMAP_THRESHOLD,
.trim_threshold = DEFAULT_TRIM_THRESHOLD,
#define NARENAS_FROM_NCORES(n) ((n) * (sizeof (long) == 4 ? 2 : 8))
- .arena_test = NARENAS_FROM_NCORES (1)
+ .arena_test = NARENAS_FROM_NCORES (1),
+ .thp_mode = malloc_thp_mode_not_supported
#if USE_TCACHE
,
.tcache_count = TCACHE_FILL_COUNT,
@@ -2011,6 +2013,11 @@ static inline void
madvise_thp (void *p, INTERNAL_SIZE_T size)
{
#ifdef MADV_HUGEPAGE
+ /* Only use __madvise if the system is using 'madvise' mode.
+ Otherwise the call is wasteful. */
+ if (mp_.thp_mode != malloc_thp_mode_madvise)
+ return;
+
/* Do not consider areas smaller than a huge page or if the tunable is
not active. */
if (mp_.thp_pagesize == 0 || size < mp_.thp_pagesize)
@@ -5649,12 +5656,9 @@ do_set_hugetlb (size_t value)
{
if (value == 1)
{
- enum malloc_thp_mode_t thp_mode = __malloc_thp_mode ();
- /*
- Only enable THP madvise usage if system does support it and
- has 'madvise' mode. Otherwise the madvise() call is wasteful.
- */
- if (thp_mode == malloc_thp_mode_madvise)
+ mp_.thp_mode = __malloc_thp_mode ();
+ if (mp_.thp_mode == malloc_thp_mode_madvise
+ || mp_.thp_mode == malloc_thp_mode_always)
mp_.thp_pagesize = __malloc_default_thp_pagesize ();
}
else if (value >= 2)
--
2.43.0
More information about the Libc-alpha
mailing list