]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm,hugetlb: allocate frozen pages in alloc_buddy_hugetlb_folio
authorOscar Salvador <osalvador@suse.de>
Fri, 11 Apr 2025 13:23:59 +0000 (15:23 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 12 May 2025 00:48:30 +0000 (17:48 -0700)
alloc_buddy_hugetlb_folio() allocates a rmappable folio, then strips the
rmappable part and freezes it.  We can simplify all that by allocating
frozen pages directly.

Link: https://lkml.kernel.org/r/20250411132359.312708-1-osalvador@suse.de
Signed-off-by: Oscar Salvador <osalvador@suse.de>
Suggested-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: David Hildenbrand <david@redhat.com>
Cc: Muchun Song <muchun.song@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/hugetlb.c

index 38738293e6b672e783981e5ae85dab1f9dd14d96..351254ad6ef87a328e6d7fbf12dc4df821253373 100644 (file)
@@ -1950,7 +1950,6 @@ static struct folio *alloc_buddy_hugetlb_folio(struct hstate *h,
        int order = huge_page_order(h);
        struct folio *folio;
        bool alloc_try_hard = true;
-       bool retry = true;
 
        /*
         * By default we always try hard to allocate the folio with
@@ -1965,22 +1964,8 @@ static struct folio *alloc_buddy_hugetlb_folio(struct hstate *h,
                gfp_mask |= __GFP_RETRY_MAYFAIL;
        if (nid == NUMA_NO_NODE)
                nid = numa_mem_id();
-retry:
-       folio = __folio_alloc(gfp_mask, order, nid, nmask);
-       /* Ensure hugetlb folio won't have large_rmappable flag set. */
-       if (folio)
-               folio_clear_large_rmappable(folio);
 
-       if (folio && !folio_ref_freeze(folio, 1)) {
-               folio_put(folio);
-               if (retry) {    /* retry once */
-                       retry = false;
-                       goto retry;
-               }
-               /* WOW!  twice in a row. */
-               pr_warn("HugeTLB unexpected inflated folio ref count\n");
-               folio = NULL;
-       }
+       folio = (struct folio *)__alloc_frozen_pages(gfp_mask, order, nid, nmask);
 
        /*
         * If we did not specify __GFP_RETRY_MAYFAIL, but still got a