malloc: Enable huge page support on main arena

This patch adds support huge page support on main arena allocation,
enable with tunable glibc.malloc.hugetlb=2.  The patch essentially
disable the __glibc_morecore() sbrk() call (similar when memory
tag does when sbrk() call does not support it) and fallback to
default page size if the memory allocation fails.

Checked on x86_64-linux-gnu.

Reviewed-by: DJ Delorie <dj@redhat.com>
This commit is contained in:
Adhemerval Zanella 2021-08-30 14:01:00 -03:00
parent 0849eed45d
commit 0f982c1827
3 changed files with 14 additions and 6 deletions

View File

@ -364,6 +364,10 @@ ptmalloc_init (void)
# endif
TUNABLE_GET (mxfast, size_t, TUNABLE_CALLBACK (set_mxfast));
TUNABLE_GET (hugetlb, size_t, TUNABLE_CALLBACK (set_hugetlb));
if (mp_.hp_pagesize > 0)
/* Force mmap for main arena instead of sbrk, so hugepages are explicitly
used. */
__always_fail_morecore = true;
#else
if (__glibc_likely (_environ != NULL))
{

View File

@ -2741,8 +2741,16 @@ sysmalloc (INTERNAL_SIZE_T nb, mstate av)
segregated mmap region.
*/
char *mbrk = sysmalloc_mmap_fallback (&size, nb, old_size, pagesize,
MMAP_AS_MORECORE_SIZE, 0, av);
char *mbrk = MAP_FAILED;
#if HAVE_TUNABLES
if (mp_.hp_pagesize > 0)
mbrk = sysmalloc_mmap_fallback (&size, nb, old_size,
mp_.hp_pagesize, mp_.hp_pagesize,
mp_.hp_flags, av);
#endif
if (mbrk == MAP_FAILED)
mbrk = sysmalloc_mmap_fallback (&size, nb, old_size, pagesize,
MMAP_AS_MORECORE_SIZE, 0, av);
if (mbrk != MAP_FAILED)
{
/* We do not need, and cannot use, another sbrk call to find end */

View File

@ -15,9 +15,7 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#if defined(SHARED) || defined(USE_MTAG)
static bool __always_fail_morecore = false;
#endif
/* Allocate INCREMENT more bytes of data space,
and return the start of data space, or NULL on errors.
@ -25,10 +23,8 @@ static bool __always_fail_morecore = false;
void *
__glibc_morecore (ptrdiff_t increment)
{
#if defined(SHARED) || defined(USE_MTAG)
if (__always_fail_morecore)
return NULL;
#endif
void *result = (void *) __sbrk (increment);
if (result == (void *) -1)