We want to limit the use of page_mapcount() to the places where it is
absolutely necessary. Let's convert migrate_vma_check_page() to work on
a folio internally so we can remove the page_mapcount() usage.

Note that we reject any large folios.

There is a lot more folio conversion to be had, but that has to wait for
another day. No functional change intended.

Signed-off-by: David Hildenbrand <da...@redhat.com>
---
 mm/migrate_device.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/mm/migrate_device.c b/mm/migrate_device.c
index d40b46ae9d65..b929b450b77c 100644
--- a/mm/migrate_device.c
+++ b/mm/migrate_device.c
@@ -324,6 +324,8 @@ static void migrate_vma_collect(struct migrate_vma *migrate)
  */
 static bool migrate_vma_check_page(struct page *page, struct page *fault_page)
 {
+       struct folio *folio = page_folio(page);
+
        /*
         * One extra ref because caller holds an extra reference, either from
         * isolate_lru_page() for a regular page, or migrate_vma_collect() for
@@ -336,18 +338,18 @@ static bool migrate_vma_check_page(struct page *page, 
struct page *fault_page)
         * check them than regular pages, because they can be mapped with a pmd
         * or with a pte (split pte mapping).
         */
-       if (PageCompound(page))
+       if (folio_test_large(folio))
                return false;
 
        /* Page from ZONE_DEVICE have one extra reference */
-       if (is_zone_device_page(page))
+       if (folio_is_zone_device(folio))
                extra++;
 
        /* For file back page */
-       if (page_mapping(page))
-               extra += 1 + page_has_private(page);
+       if (folio_mapping(folio))
+               extra += 1 + folio_has_private(folio);
 
-       if ((page_count(page) - extra) > page_mapcount(page))
+       if ((folio_ref_count(folio) - extra) > folio_mapcount(folio))
                return false;
 
        return true;
-- 
2.44.0


Reply via email to