mm: migrate_device: use more folio in migrate_device_finalize()
authorKefeng Wang <wangkefeng.wang@huawei.com>
Mon, 26 Aug 2024 06:58:12 +0000 (14:58 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 9 Sep 2024 23:38:59 +0000 (16:38 -0700)
Saves a couple of calls to compound_head() and remove last two callers of
putback_lru_page().

Link: https://lkml.kernel.org/r/20240826065814.1336616-5-wangkefeng.wang@huawei.com
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
Reviewed-by: Alistair Popple <apopple@nvidia.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/migrate_device.c

index b49f4956617a8f32cb878ad61b22373690612e23..6ea3d055f520dcfe5bc4afa84f2944d0713df29a 100644 (file)
@@ -815,42 +815,45 @@ void migrate_device_finalize(unsigned long *src_pfns,
        unsigned long i;
 
        for (i = 0; i < npages; i++) {
-               struct folio *dst, *src;
+               struct folio *dst = NULL, *src = NULL;
                struct page *newpage = migrate_pfn_to_page(dst_pfns[i]);
                struct page *page = migrate_pfn_to_page(src_pfns[i]);
 
+               if (newpage)
+                       dst = page_folio(newpage);
+
                if (!page) {
-                       if (newpage) {
-                               unlock_page(newpage);
-                               put_page(newpage);
+                       if (dst) {
+                               folio_unlock(dst);
+                               folio_put(dst);
                        }
                        continue;
                }
 
-               if (!(src_pfns[i] & MIGRATE_PFN_MIGRATE) || !newpage) {
-                       if (newpage) {
-                               unlock_page(newpage);
-                               put_page(newpage);
+               src = page_folio(page);
+
+               if (!(src_pfns[i] & MIGRATE_PFN_MIGRATE) || !dst) {
+                       if (dst) {
+                               folio_unlock(dst);
+                               folio_put(dst);
                        }
-                       newpage = page;
+                       dst = src;
                }
 
-               src = page_folio(page);
-               dst = page_folio(newpage);
                remove_migration_ptes(src, dst, false);
                folio_unlock(src);
 
-               if (is_zone_device_page(page))
-                       put_page(page);
+               if (folio_is_zone_device(src))
+                       folio_put(src);
                else
-                       putback_lru_page(page);
+                       folio_putback_lru(src);
 
-               if (newpage != page) {
-                       unlock_page(newpage);
-                       if (is_zone_device_page(newpage))
-                               put_page(newpage);
+               if (dst != src) {
+                       folio_unlock(dst);
+                       if (folio_is_zone_device(dst))
+                               folio_put(dst);
                        else
-                               putback_lru_page(newpage);
+                               folio_putback_lru(dst);
                }
        }
 }