Re: [PATCH] mm/hugetlb: account for allowed nodes when gathering surplus pages

From: Muchun Song

Date: Thu Sep 10 2026 - 04:53:27 EST




> On Sep 9, 2026, at 15:46, Huaisheng Ye <yehuaisheng@xxxxxxxxxxxxxx> wrote:
>
> Hugetlb reservations are accounted globally, but hugetlb_acct_memory()
> also verifies that the current cpuset and MPOL_BIND policy contain enough
> free huge pages to add a new reservation.
>
> gather_surplus_pages() calculates its allocation shortfall from the global
> free and reserved counters. If the global pool has enough free pages, but
> those pages reside outside the nodes allowed by the task, it allocates no
> surplus pages. The subsequent allowed_mems_nr() check then rejects the
> reservation and mmap() fails with ENOMEM, even when
> nr_overcommit_hugepages permits allocating surplus pages on the allowed
> nodes.
>
> Calculate both the global shortfall and the shortfall within the allowed
> nodes, and allocate the larger of the two. Include surplus pages allocated
> outside hugetlb_lock in both calculations when rechecking after reacquiring
> the lock. These pages are constrained by alloc_nodemask, so they satisfy
> both shortages.
>
> Easy way to reproduce this issue with 2+ NUMA nodes system:
>
> # echo 0 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepage
> # echo 3 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
> # echo 1 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_overcommit_hugepages
> # cd tools/testing/selftests/mm
> # numactl --membind=1 ./hugetlb-mmap 2 21
> TAP version 13
> # [INFO] detected hugetlb page size: 2048 KiB
> # [INFO] detected hugetlb page size: 1048576 KiB
> # 2048 kB hugepages
> 1..2
> # Mapping 2 Mbytes
> Bail out! mmap: Cannot allocate memory (12)
> # Planned tests != run tests (2 != 0)
> # Totals: pass:0 fail:0 xfail:0 xpass:0 skip:0 error:0
>
> This fixes hugetlb mappings when, for example, a task runs with
> MPOL_BIND on Node 1 while the existing free huge pages are on Node 0.
>
> Similar issue also could be found in ltp if the free pages of global pool
> reside outside the nodes allowed by the application.
> # cd ltp/testcases/kernel/mem/hugetlb/hugemmap/
> # numactl --cpunodebind=0 --membind=1 ./hugemmap10
>
> Signed-off-by: Huaisheng Ye <yehuaisheng@xxxxxxxxxxxxxx>

Acked-by: Muchun Song <muchun.song@xxxxxxxxx>

Thanks.