]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
hugetlb: fix hugepages_setup when deal with pernode
authorPeng Liu <liupeng256@huawei.com>
Thu, 14 Apr 2022 19:16:47 +0000 (12:16 -0700)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Thu, 14 Apr 2022 21:49:50 +0000 (17:49 -0400)
Hugepages can be specified to pernode since "hugetlbfs: extend the
definition of hugepages parameter to support node allocation", but the
following problem is observed.

Confusing behavior is observed when both 1G and 2M hugepage is set
after "numa=off".
 cmdline hugepage settings:
  hugepagesz=1G hugepages=0:3,1:3
  hugepagesz=2M hugepages=0:1024,1:1024
 results:
  HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
  HugeTLB registered 2.00 MiB page size, pre-allocated 1024 pages

Furthermore, confusing behavior can be also observed when an invalid node
behind a valid node.  To fix this, never allocate any typical hugepage
when an invalid parameter is received.

Link: https://lkml.kernel.org/r/20220413032915.251254-3-liupeng256@huawei.com
Fixes: b5389086ad7b ("hugetlbfs: extend the definition of hugepages parameter to support node allocation")
Signed-off-by: Peng Liu <liupeng256@huawei.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Liu Yuntao <liuyuntao10@huawei.com>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Muchun Song <songmuchun@bytedance.com>
Cc: Zhenguo Yao <yaozhenguo1@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/hugetlb.c

index 979a8addef3d67d0094c3cf7220799810d498357..8f4d824ac621e204818f5078fd7d27fc87e8f677 100644 (file)
@@ -4126,6 +4126,20 @@ bool __init __weak hugetlb_node_alloc_supported(void)
 {
        return true;
 }
+
+static void __init hugepages_clear_pages_in_node(void)
+{
+       if (!hugetlb_max_hstate) {
+               default_hstate_max_huge_pages = 0;
+               memset(default_hugepages_in_node, 0,
+                       MAX_NUMNODES * sizeof(unsigned int));
+       } else {
+               parsed_hstate->max_huge_pages = 0;
+               memset(parsed_hstate->max_huge_pages_node, 0,
+                       MAX_NUMNODES * sizeof(unsigned int));
+       }
+}
+
 /*
  * hugepages command line processing
  * hugepages normally follows a valid hugepagsz or default_hugepagsz
@@ -4213,6 +4227,7 @@ static int __init hugepages_setup(char *s)
 
 invalid:
        pr_warn("HugeTLB: Invalid hugepages parameter %s\n", p);
+       hugepages_clear_pages_in_node();
        return 0;
 }
 __setup("hugepages=", hugepages_setup);