| From: Peng Liu <liupeng256@huawei.com> |
| Subject: hugetlb: fix hugepages_setup when deal with pernode |
| |
| 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 | 15 +++++++++++++++ |
| 1 file changed, 15 insertions(+) |
| |
| --- a/mm/hugetlb.c~hugetlb-fix-hugepages_setup-when-deal-with-pernode |
| +++ a/mm/hugetlb.c |
| @@ -4122,6 +4122,20 @@ bool __init __weak hugetlb_node_alloc_su |
| { |
| 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 * |
| |
| invalid: |
| pr_warn("HugeTLB: Invalid hugepages parameter %s\n", p); |
| + hugepages_clear_pages_in_node(); |
| return 0; |
| } |
| __setup("hugepages=", hugepages_setup); |
| _ |