hugetlb: fix hugepages_setup when deal with pernode
authorPeng Liu <liupeng256@huawei.com>
Fri, 29 Apr 2022 21:36:57 +0000 (14:36 -0700)
committerakpm <akpm@linux-foundation.org>
Fri, 29 Apr 2022 21:36:57 +0000 (14:36 -0700)
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>
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Liu Yuntao <liuyuntao10@huawei.com>
Cc: Muchun Song <songmuchun@bytedance.com>
Cc: Zhenguo Yao <yaozhenguo1@gmail.com>
Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/hugetlb.c

index 6385f86..c6228cd 100644 (file)
@@ -4122,6 +4122,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
@@ -4209,6 +4223,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);