diff options
author | Wilco Dijkstra <wilco.dijkstra@arm.com> | 2025-08-08 14:00:11 +0000 |
---|---|---|
committer | Wilco Dijkstra <wilco.dijkstra@arm.com> | 2025-08-08 14:00:11 +0000 |
commit | 05a14648e92c3da5fa44bdd24e6b56f8d9f38b1a (patch) | |
tree | 7abf4b4c1529febe251693367c0959186e7ab96c | |
parent | 94ebcfc4f253129ca772392fe034eea6c0aa6963 (diff) | |
download | glibc-05a14648e92c3da5fa44bdd24e6b56f8d9f38b1a.zip glibc-05a14648e92c3da5fa44bdd24e6b56f8d9f38b1a.tar.gz glibc-05a14648e92c3da5fa44bdd24e6b56f8d9f38b1a.tar.bz2 |
malloc: Support THP in arenas
Arenas support huge pages but not transparent huge pages. Add this by
also checking mp_.thp_pagesize when creating a new arena, and use madvise.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
-rw-r--r-- | malloc/arena.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/malloc/arena.c b/malloc/arena.c index 90c526f..91a4f36 100644 --- a/malloc/arena.c +++ b/malloc/arena.c @@ -444,10 +444,13 @@ alloc_new_heap (size_t size, size_t top_pad, size_t pagesize, static heap_info * new_heap (size_t size, size_t top_pad) { - if (mp_.hp_pagesize != 0 && mp_.hp_pagesize <= heap_max_size ()) + bool use_hugepage = mp_.hp_pagesize != 0; + size_t pagesize = use_hugepage ? mp_.hp_pagesize : mp_.thp_pagesize; + + if (pagesize != 0 && pagesize <= heap_max_size ()) { - heap_info *h = alloc_new_heap (size, top_pad, mp_.hp_pagesize, - mp_.hp_flags); + heap_info *h = alloc_new_heap (size, top_pad, pagesize, + use_hugepage ? mp_.hp_flags : 0); if (h != NULL) return h; } @@ -479,6 +482,8 @@ grow_heap (heap_info *h, long diff) h->mprotect_size = new_size; } + madvise_thp (h, new_size); + h->size = new_size; LIBC_PROBE (memory_heap_more, 2, h, h->size); return 0; |