}
 
 /*
- * Attempt to migrate a misplaced page to the specified destination
+ * Attempt to migrate a misplaced folio to the specified destination
  * node. Caller is expected to have an elevated reference count on
- * the page that will be dropped by this function before returning.
+ * the folio that will be dropped by this function before returning.
  */
-int migrate_misplaced_page(struct page *page, struct vm_area_struct *vma,
-                          int node)
+int migrate_misplaced_folio(struct folio *folio, struct vm_area_struct *vma,
+                           int node)
 {
        pg_data_t *pgdat = NODE_DATA(node);
        int isolated;
        int nr_remaining;
        unsigned int nr_succeeded;
        LIST_HEAD(migratepages);
-       int nr_pages = thp_nr_pages(page);
+       int nr_pages = folio_nr_pages(folio);
 
        /*
-        * Don't migrate file pages that are mapped in multiple processes
+        * Don't migrate file folios that are mapped in multiple processes
         * with execute permissions as they are probably shared libraries.
+        * To check if the folio is shared, ideally we want to make sure
+        * every page is mapped to the same process. Doing that is very
+        * expensive, so check the estimated mapcount of the folio instead.
         */
-       if (page_mapcount(page) != 1 && page_is_file_lru(page) &&
+       if (folio_estimated_sharers(folio) != 1 && folio_is_file_lru(folio) &&
            (vma->vm_flags & VM_EXEC))
                goto out;
 
        /*
-        * Also do not migrate dirty pages as not all filesystems can move
-        * dirty pages in MIGRATE_ASYNC mode which is a waste of cycles.
+        * Also do not migrate dirty folios as not all filesystems can move
+        * dirty folios in MIGRATE_ASYNC mode which is a waste of cycles.
         */
-       if (page_is_file_lru(page) && PageDirty(page))
+       if (folio_is_file_lru(folio) && folio_test_dirty(folio))
                goto out;
 
-       isolated = numamigrate_isolate_folio(pgdat, page_folio(page));
+       isolated = numamigrate_isolate_folio(pgdat, folio);
        if (!isolated)
                goto out;
 
-       list_add(&page->lru, &migratepages);
+       list_add(&folio->lru, &migratepages);
        nr_remaining = migrate_pages(&migratepages, alloc_misplaced_dst_folio,
                                     NULL, node, MIGRATE_ASYNC,
                                     MR_NUMA_MISPLACED, &nr_succeeded);
        if (nr_remaining) {
                if (!list_empty(&migratepages)) {
-                       list_del(&page->lru);
-                       mod_node_page_state(page_pgdat(page), NR_ISOLATED_ANON +
-                                       page_is_file_lru(page), -nr_pages);
-                       putback_lru_page(page);
+                       list_del(&folio->lru);
+                       node_stat_mod_folio(folio, NR_ISOLATED_ANON +
+                                       folio_is_file_lru(folio), -nr_pages);
+                       folio_putback_lru(folio);
                }
                isolated = 0;
        }
        if (nr_succeeded) {
                count_vm_numa_events(NUMA_PAGE_MIGRATE, nr_succeeded);
-               if (!node_is_toptier(page_to_nid(page)) && node_is_toptier(node))
+               if (!node_is_toptier(folio_nid(folio)) && node_is_toptier(node))
                        mod_node_page_state(pgdat, PGPROMOTE_SUCCESS,
                                            nr_succeeded);
        }
        return isolated;
 
 out:
-       put_page(page);
+       folio_put(folio);
        return 0;
 }
 #endif /* CONFIG_NUMA_BALANCING */