[PATCH] malloc: remember that thp_mode got probed

Aurelien Jarno aurelien@aurel32.net
Wed Feb 25 21:36:06 GMT 2026


On aarch64, following the new 2MB THP default introduced in 321e1fc73f53
and when /sys/kernel is not accessible (as in some containers [1]),
/sys/kernel/mm/transparent_hugepage/enabled is probed on every malloc()
call.

This causes some performance regression, and also sets errno to ENOENT
on each malloc call. Some programs are not prepared for that (even
though they arguably should be), causing some regressions [2].

Fix that by introducing a new THP state, malloc_thp_mode_unknown, which
is distinct from malloc_thp_mode_not_supported. This makes possible to
record that the THP mode has been probed and found as not supported,
avoiding repeatedly poking the file. In turns this "fixes" half of the
regressions found so far.

[1] https://systemd.io/CONTAINER_INTERFACE/
[2] https://bugs.debian.org/cgi-bin/pkgreport.cgi?tag=glibc-2.43-arm64-thp;users=debian-glibc@lists.debian.org
---
 malloc/malloc.c                    | 4 ++--
 sysdeps/generic/malloc-hugepages.h | 3 ++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/malloc/malloc.c b/malloc/malloc.c
index a49e211925..408363c7f0 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -1826,7 +1826,7 @@ static struct malloc_par mp_ =
   .trim_threshold = DEFAULT_TRIM_THRESHOLD,
 #define NARENAS_FROM_NCORES(n) ((n) * (sizeof (long) == 4 ? 2 : 8))
   .arena_test = NARENAS_FROM_NCORES (1),
-  .thp_mode = malloc_thp_mode_not_supported
+  .thp_mode = malloc_thp_mode_unknown
 #if USE_TCACHE
   ,
   .tcache_count = TCACHE_FILL_COUNT,
@@ -1906,7 +1906,7 @@ static __always_inline void
 thp_init (void)
 {
   /* Initialize only once if DEFAULT_THP_PAGESIZE is defined.  */
-  if (DEFAULT_THP_PAGESIZE == 0 || mp_.thp_mode != malloc_thp_mode_not_supported)
+  if (DEFAULT_THP_PAGESIZE == 0 || mp_.thp_mode != malloc_thp_mode_unknown)
     return;
 
   /* Set thp_pagesize even if thp_mode is never.  This reduces frequency
diff --git a/sysdeps/generic/malloc-hugepages.h b/sysdeps/generic/malloc-hugepages.h
index ab2690f7b8..7d2c81904b 100644
--- a/sysdeps/generic/malloc-hugepages.h
+++ b/sysdeps/generic/malloc-hugepages.h
@@ -29,7 +29,8 @@ enum malloc_thp_mode_t
   malloc_thp_mode_always,
   malloc_thp_mode_madvise,
   malloc_thp_mode_never,
-  malloc_thp_mode_not_supported
+  malloc_thp_mode_not_supported,
+  malloc_thp_mode_unknown
 };
 
 enum malloc_thp_mode_t __malloc_thp_mode (void) attribute_hidden;
-- 
2.51.0



More information about the Libc-alpha mailing list