mirror of
git://sourceware.org/git/glibc.git
synced 2025-02-23 13:09:58 +08:00
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:
parent
0849eed45d
commit
0f982c1827
@ -364,6 +364,10 @@ ptmalloc_init (void)
|
|||||||
# endif
|
# endif
|
||||||
TUNABLE_GET (mxfast, size_t, TUNABLE_CALLBACK (set_mxfast));
|
TUNABLE_GET (mxfast, size_t, TUNABLE_CALLBACK (set_mxfast));
|
||||||
TUNABLE_GET (hugetlb, size_t, TUNABLE_CALLBACK (set_hugetlb));
|
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
|
#else
|
||||||
if (__glibc_likely (_environ != NULL))
|
if (__glibc_likely (_environ != NULL))
|
||||||
{
|
{
|
||||||
|
@ -2741,8 +2741,16 @@ sysmalloc (INTERNAL_SIZE_T nb, mstate av)
|
|||||||
segregated mmap region.
|
segregated mmap region.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *mbrk = sysmalloc_mmap_fallback (&size, nb, old_size, pagesize,
|
char *mbrk = MAP_FAILED;
|
||||||
MMAP_AS_MORECORE_SIZE, 0, av);
|
#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)
|
if (mbrk != MAP_FAILED)
|
||||||
{
|
{
|
||||||
/* We do not need, and cannot use, another sbrk call to find end */
|
/* We do not need, and cannot use, another sbrk call to find end */
|
||||||
|
@ -15,9 +15,7 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#if defined(SHARED) || defined(USE_MTAG)
|
|
||||||
static bool __always_fail_morecore = false;
|
static bool __always_fail_morecore = false;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Allocate INCREMENT more bytes of data space,
|
/* Allocate INCREMENT more bytes of data space,
|
||||||
and return the start of data space, or NULL on errors.
|
and return the start of data space, or NULL on errors.
|
||||||
@ -25,10 +23,8 @@ static bool __always_fail_morecore = false;
|
|||||||
void *
|
void *
|
||||||
__glibc_morecore (ptrdiff_t increment)
|
__glibc_morecore (ptrdiff_t increment)
|
||||||
{
|
{
|
||||||
#if defined(SHARED) || defined(USE_MTAG)
|
|
||||||
if (__always_fail_morecore)
|
if (__always_fail_morecore)
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
|
||||||
|
|
||||||
void *result = (void *) __sbrk (increment);
|
void *result = (void *) __sbrk (increment);
|
||||||
if (result == (void *) -1)
|
if (result == (void *) -1)
|
||||||
|
Loading…
Reference in New Issue
Block a user