Aslan found a bug in the per-node hugetlb_cma area size calculation: the total remaining size should cap the per-node area size instead of be the minimal possible allocation. Without the fix: [ 0.004136] hugetlb_cma: reserve 2048 MiB, up to 1024 MiB per node [ 0.004138] cma: Reserved 2048 MiB at 0x0000000180000000 [ 0.004139] hugetlb_cma: reserved 2048 MiB on node 0 With the fix: [ 0.006780] hugetlb_cma: reserve 2048 MiB, up to 1024 MiB per node [ 0.006786] cma: Reserved 1024 MiB at 0x00000001c0000000 [ 0.006787] hugetlb_cma: reserved 1024 MiB on node 0 [ 0.006788] cma: Reserved 1024 MiB at 0x00000003c0000000 [ 0.006789] hugetlb_cma: reserved 1024 MiB on node 1 Reported-by: Aslan Barkirov <aslan@xxxxxx> Signed-off-by: Roman Gushchin <guro@xxxxxx> --- mm/hugetlb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 456f4c010fea..44b47c2b6fab 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -5590,7 +5590,7 @@ void __init hugetlb_cma_reserve(int order) min_pfn = min_low_pfn; max_pfn = max_low_pfn; #endif - size = max(per_node, hugetlb_cma_size - reserved); + size = min(per_node, hugetlb_cma_size - reserved); size = round_up(size, PAGE_SIZE << order); if (size > ((max_pfn - min_pfn) << PAGE_SHIFT) / 2) { -- 2.25.1