The default kernel configuration does not allow any huge page allocation until after setting nr_hugepages or nr_overcommit_hugepages to a non-zero value; without setting those, mmap attempts with MAP_HUGETLB will always fail with -ENOMEM. nr_overcommit_hugepages allows userspace to attempt to allocate huge pages at runtime, succeeding if the kernel can find or assemble a free huge page. Provide a Kconfig option to make nr_overcommit_hugepages default to unlimited, which permits userspace to always attempt huge page allocation on a best-effort basis. This makes it easier and more worthwhile for random applications and libraries to opportunistically attempt MAP_HUGETLB allocations without special configuration. In particular, current versions of liburing with IORING_SETUP_NO_MMAP attempt to allocate the rings in a huge page. This seems likely to lead to more applications and libraries attempting to use huge pages. Signed-off-by: Josh Triplett <josh@xxxxxxxxxxxxxxxx> --- mm/Kconfig | 14 ++++++++++++++ mm/hugetlb.c | 2 ++ 2 files changed, 16 insertions(+) diff --git a/mm/Kconfig b/mm/Kconfig index 7672a22647b4..32c13610c5c4 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -824,6 +824,20 @@ config READ_ONLY_THP_FOR_FS endif # TRANSPARENT_HUGEPAGE +config HUGEPAGE_OVERCOMMIT_DEFAULT_UNLIMITED + bool "Allow huge page allocation attempts by default" + depends on HUGETLB_PAGE + help + By default, the kernel does not allow any huge page allocation until + after setting nr_hugepages or nr_overcommit_hugepages to a non-zero + value. nr_overcommit_hugepages allows userspace to attempt to + allocate huge pages at runtime, succeeding if the kernel can find or + assemble a free huge page. + + Enable this option to make nr_overcommit_hugepages default to + unlimited, which permits userspace to always attempt hugepage + allocation. + # # UP and nommu archs use km based percpu allocator # diff --git a/mm/hugetlb.c b/mm/hugetlb.c index f154019e6b84..65abbe254e10 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -4305,6 +4305,8 @@ void __init hugetlb_add_hstate(unsigned int order) mutex_init(&h->resize_lock); h->order = order; h->mask = ~(huge_page_size(h) - 1); + if (IS_ENABLED(CONFIG_HUGEPAGE_OVERCOMMIT_DEFAULT_UNLIMITED)) + h->nr_overcommit_huge_pages = ULONG_MAX; for (i = 0; i < MAX_NUMNODES; ++i) INIT_LIST_HEAD(&h->hugepage_freelists[i]); INIT_LIST_HEAD(&h->hugepage_activelist); -- 2.40.1