mm/migrate_device: use folio_mapcount() in migrate_vma_check_page()
authorDavid Hildenbrand <david@redhat.com>
Tue, 9 Apr 2024 19:22:57 +0000 (21:22 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 6 May 2024 00:53:31 +0000 (17:53 -0700)
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.

Link: https://lkml.kernel.org/r/20240409192301.907377-15-david@redhat.com
Signed-off-by: David Hildenbrand <david@redhat.com>
Cc: Chris Zankel <chris@zankel.net>
Cc: Hugh Dickins <hughd@google.com>
Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: Miaohe Lin <linmiaohe@huawei.com>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Naoya Horiguchi <nao.horiguchi@gmail.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Richard Chang <richardycc@google.com>
Cc: Rich Felker <dalias@libc.org>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Yin Fengwei <fengwei.yin@intel.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/migrate_device.c

index d40b46ae9d65b7c012c53b3bc0cb21a6818d302b..b929b450b77c3dac2266e2da5969f02c0de211ba 100644 (file)
@@ -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;