]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/hugetlb: fix set_max_huge_pages() when there are surplus pages
authorJinjiang Tu <tujinjiang@huawei.com>
Tue, 25 Feb 2025 14:19:33 +0000 (22:19 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 28 Feb 2025 01:00:34 +0000 (17:00 -0800)
In set_max_huge_pages(), min_count should mean the acquired persistent
huge pages, but it contains surplus huge pages.  It will lead to failing
to free free huge pages for a node.

Steps to reproduce:
1) create 5 huge pages in Node 0
2) run a program to use all the huge pages
3) create 5 huge pages in Node 1
4) echo 0 > nr_hugepages for Node 1 to free the huge pages

The result:
        Node 0    Node 1
Total     5         5
Free      0         5
Surp      5         5

With this patch, step 4) destroys the 5 huge pages in Node 1

The result with this patch:
        Node 0    Node 1
Total     5         0
Free      0         0
Surp      5         0

Link: https://lkml.kernel.org/r/20250225141933.3852667-1-tujinjiang@huawei.com
Fixes: 9a30523066cd ("hugetlb: add per node hstate attributes")
Signed-off-by: Jinjiang Tu <tujinjiang@huawei.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Lee Schermerhorn <lee.schermerhorn@hp.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Oscar Salvador <osalvador@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/hugetlb.c

index 811b29f77abf869e22a3522283efa036a60512b2..70a012af4a8d24a806439be1b159aa9c6062b541 100644 (file)
@@ -3766,7 +3766,7 @@ static int set_max_huge_pages(struct hstate *h, unsigned long count, int nid,
         * and won't grow the pool anywhere else. Not until one of the
         * sysctls are changed, or the surplus pages go out of use.
         */
-       min_count = h->resv_huge_pages + h->nr_huge_pages - h->free_huge_pages;
+       min_count = h->resv_huge_pages + persistent_huge_pages(h) - h->free_huge_pages;
        min_count = max(count, min_count);
        try_to_free_low(h, min_count, nodes_allowed);