[PATCH v2 3/4] elf: Align large load segments to PMD huge page size for THP

Florian Weimer fweimer@redhat.com
Thu Feb 26 12:01:34 GMT 2026


* WANG Rui:

> diff --git a/sysdeps/unix/sysv/linux/wordsize-64/dl-map-segment-align.c b/sysdeps/unix/sysv/linux/wordsize-64/dl-map-segment-align.c
> new file mode 100644
> index 0000000000..3c57d593bd
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/wordsize-64/dl-map-segment-align.c
> @@ -0,0 +1,56 @@
> +/* _dl_map_segment_align.  Linux version.
> +   Copyright (C) 2026 Free Software Foundation, Inc.
> +   Copyright The GNU Toolchain Authors.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <dl-map-segment-align.h>
> +#include <dl-tunables.h>
> +#include <malloc-hugepages.h>
> +
> +#define MAX_THP_PAGESIZE (32 * 1024 * 1024)
> +
> +ElfW (Addr)
> +_dl_map_segment_align (const struct loadcmd *c, ElfW (Addr) p_align_max)
> +{
> +  static enum malloc_thp_mode_t thp_mode = malloc_thp_mode_not_supported;
> +  static unsigned long int thp_pagesize;
> +
> +#ifndef DL_MAP_SEGMENT_ALIGN_THP_DEFAULT
> +  if (TUNABLE_GET (glibc, malloc, hugetlb, size_t, NULL) != 1)
> +    return p_align_max;
> +#endif
> +
> +  if (__glibc_unlikely (thp_mode == malloc_thp_mode_not_supported
> +			|| thp_pagesize == 0))
> +    {
> +      thp_mode = __malloc_thp_mode ();
> +      thp_pagesize = __malloc_default_thp_pagesize ();
> +    }
> +
> +  /* Aligning load segments that are large enough to the PMD size helps
> +     improve THP eligibility and reduces TLB pressure.
> +     We cap the huge page size at MAX_THP_PAGESIZE to avoid over-aligning
> +     on systems with very large normal pages (like 64K pages with 512M
> +     huge pages). */
> +  if (thp_mode == malloc_thp_mode_always && thp_pagesize <= MAX_THP_PAGESIZE
> +      && ((c->mapstart | c->mapoff) & (thp_pagesize - 1)) == 0
> +      && (c->mapend - c->mapstart) >= thp_pagesize
> +      && p_align_max < thp_pagesize && (c->prot & PROT_WRITE) == 0)
> +    return thp_pagesize;
> +
> +  return p_align_max;
> +}

I'm not sure if this function generalizes well beyond Loongarch.

On x86-64, we could perhaps round up alignment if the CPU implements
page coalescing in the TLB.  (This is currently not an enumerated
feature, but fairly widely implemented.)  But we should not increase
alignment to the THP size by default because that may move indirect
branch targets out of the supported range of the first-line indirect
branch predictor where things would otherwise fit.  Code TLB pressure is
probably less of a problem than indirect branch predictor capacity.

Thanks,
Florian



More information about the Libc-alpha mailing list