mm/compaction: use folio in hugetlb pathway
authorVishal Moola (Oracle) <vishal.moola@gmail.com>
Tue, 1 Apr 2025 02:10:25 +0000 (19:10 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 12 May 2025 00:48:08 +0000 (17:48 -0700)
Use a folio in the hugetlb pathway during the compaction migrate-able
pageblock scan.

This removes a call to compound_head().

Link: https://lkml.kernel.org/r/20250401021025.637333-2-vishal.moola@gmail.com
Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
Acked-by: Oscar Salvador <osalvador@suse.de>
Reviewed-by: Zi Yan <ziy@nvidia.com>
Cc: Muchun Song <muchun.song@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/hugetlb.h
mm/compaction.c
mm/hugetlb.c

index 8f3ac83..a57bed8 100644 (file)
@@ -695,7 +695,7 @@ struct huge_bootmem_page {
 
 bool hugetlb_bootmem_page_zones_valid(int nid, struct huge_bootmem_page *m);
 
-int isolate_or_dissolve_huge_page(struct page *page, struct list_head *list);
+int isolate_or_dissolve_huge_folio(struct folio *folio, struct list_head *list);
 int replace_free_hugepage_folios(unsigned long start_pfn, unsigned long end_pfn);
 void wait_for_freed_hugetlb_folios(void);
 struct folio *alloc_hugetlb_folio(struct vm_area_struct *vma,
@@ -1083,7 +1083,7 @@ static inline struct folio *filemap_lock_hugetlb_folio(struct hstate *h,
        return NULL;
 }
 
-static inline int isolate_or_dissolve_huge_page(struct page *page,
+static inline int isolate_or_dissolve_huge_folio(struct folio *folio,
                                                struct list_head *list)
 {
        return -ENOMEM;
index ca71fd3..dd868c8 100644 (file)
@@ -1001,10 +1001,11 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
                                locked = NULL;
                        }
 
-                       ret = isolate_or_dissolve_huge_page(page, &cc->migratepages);
+                       folio = page_folio(page);
+                       ret = isolate_or_dissolve_huge_folio(folio, &cc->migratepages);
 
                        /*
-                        * Fail isolation in case isolate_or_dissolve_huge_page()
+                        * Fail isolation in case isolate_or_dissolve_huge_folio()
                         * reports an error. In case of -ENOMEM, abort right away.
                         */
                        if (ret < 0) {
@@ -1016,12 +1017,11 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
                                goto isolate_fail;
                        }
 
-                       if (PageHuge(page)) {
+                       if (folio_test_hugetlb(folio)) {
                                /*
                                 * Hugepage was successfully isolated and placed
                                 * on the cc->migratepages list.
                                 */
-                               folio = page_folio(page);
                                low_pfn += folio_nr_pages(folio) - 1;
                                goto isolate_success_no_list;
                        }
index a44d4b0..a2c1114 100644 (file)
@@ -2896,10 +2896,9 @@ free_new:
        return ret;
 }
 
-int isolate_or_dissolve_huge_page(struct page *page, struct list_head *list)
+int isolate_or_dissolve_huge_folio(struct folio *folio, struct list_head *list)
 {
        struct hstate *h;
-       struct folio *folio = page_folio(page);
        int ret = -EBUSY;
 
        /*