mm/hugetlb: mm/memory_hotplug: use a folio in scan_movable_pages()
authorSidhartha Kumar <sidhartha.kumar@oracle.com>
Thu, 30 May 2024 17:14:27 +0000 (10:14 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 4 Jul 2024 02:30:02 +0000 (19:30 -0700)
By using a folio in scan_movable_pages() we convert the last user of the
page-based hugetlb information macro functions to the folio version.
After this conversion, we can safely remove the page-based definitions
from include/linux/hugetlb.h.

Link: https://lkml.kernel.org/r/20240530171427.242018-1-sidhartha.kumar@oracle.com
Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Oscar Salvador <osalvador@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/hugetlb.h
mm/memory_hotplug.c

index 15a58f69782ce6b4ee4ad66a862d03399f670a3b..279aca379b950c28ae408ba5499d65cf8cdc39c7 100644 (file)
@@ -616,9 +616,7 @@ static __always_inline                                              \
 bool folio_test_hugetlb_##flname(struct folio *folio)          \
        {       void *private = &folio->private;                \
                return test_bit(HPG_##flname, private);         \
-       }                                                       \
-static inline int HPage##uname(struct page *page)              \
-       { return test_bit(HPG_##flname, &(page->private)); }
+       }
 
 #define SETHPAGEFLAG(uname, flname)                            \
 static __always_inline                                         \
@@ -637,8 +635,6 @@ void folio_clear_hugetlb_##flname(struct folio *folio)              \
 #define TESTHPAGEFLAG(uname, flname)                           \
 static inline bool                                             \
 folio_test_hugetlb_##flname(struct folio *folio)               \
-       { return 0; }                                           \
-static inline int HPage##uname(struct page *page)              \
        { return 0; }
 
 #define SETHPAGEFLAG(uname, flname)                            \
index 431b1f6753c0b9e1a612ecc68b3d0c9b278593f0..9c36eb3bbd3ba2f4a1a7c3c21629beb963a58d15 100644 (file)
@@ -1731,8 +1731,8 @@ static int scan_movable_pages(unsigned long start, unsigned long end,
        unsigned long pfn;
 
        for (pfn = start; pfn < end; pfn++) {
-               struct page *page, *head;
-               unsigned long skip;
+               struct page *page;
+               struct folio *folio;
 
                if (!pfn_valid(pfn))
                        continue;
@@ -1753,7 +1753,7 @@ static int scan_movable_pages(unsigned long start, unsigned long end,
 
                if (!PageHuge(page))
                        continue;
-               head = compound_head(page);
+               folio = page_folio(page);
                /*
                 * This test is racy as we hold no reference or lock.  The
                 * hugetlb page could have been free'ed and head is no longer
@@ -1761,10 +1761,9 @@ static int scan_movable_pages(unsigned long start, unsigned long end,
                 * cases false positives and negatives are possible.  Calling
                 * code must deal with these scenarios.
                 */
-               if (HPageMigratable(head))
+               if (folio_test_hugetlb_migratable(folio))
                        goto found;
-               skip = compound_nr(head) - (pfn - page_to_pfn(head));
-               pfn += skip - 1;
+               pfn |= folio_nr_pages(folio) - 1;
        }
        return -ENOENT;
 found: