mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
malloc: Improve MAP_HUGETLB with glibc.malloc.hugetlb=2
Even for explicit large page support, allocation might use mmap without the hugepage bit set if the requested size is smaller than mmap_threshold. For this case where mmap is issued, MAP_HUGETLB is set iff the allocation size is larger than the used large page. To force such allocations to use large pages, also tune the mmap_threhold (if it is not explicit set by a tunable). This forces allocation to follow the sbrk path, which will fall back to mmap (which will try large pages before galling back to default mmap). Checked on x86_64-linux-gnu. Reviewed-by: DJ Delorie <dj@redhat.com> Tested-by: Zhangfei Gao <zhangfei.gao@linaro.org>
This commit is contained in:
@@ -312,10 +312,17 @@ 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)
|
if (mp_.hp_pagesize > 0)
|
||||||
/* Force mmap for main arena instead of sbrk, so hugepages are explicitly
|
{
|
||||||
used. */
|
/* Force mmap for main arena instead of sbrk, so MAP_HUGETLB is always
|
||||||
__always_fail_morecore = true;
|
tried. Also tune the mmap threshold, so allocation smaller than the
|
||||||
|
large page will also try to use large pages by falling back
|
||||||
|
to sysmalloc_mmap_fallback on sysmalloc. */
|
||||||
|
if (!TUNABLE_IS_INITIALIZED (mmap_threshold))
|
||||||
|
do_set_mmap_threshold (mp_.hp_pagesize);
|
||||||
|
__always_fail_morecore = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Managing heaps and arenas (for concurrent threads) */
|
/* Managing heaps and arenas (for concurrent threads) */
|
||||||
|
Reference in New Issue
Block a user