struct mm_struct *mm = rmap_item->mm;
        unsigned long addr = rmap_item->address;
        struct vm_area_struct *vma;
-       struct page *page;
+       struct page *page = NULL;
+       struct folio_walk fw;
+       struct folio *folio;
 
        mmap_read_lock(mm);
        vma = find_mergeable_vma(mm, addr);
        if (!vma)
                goto out;
 
-       page = follow_page(vma, addr, FOLL_GET);
-       if (IS_ERR_OR_NULL(page))
-               goto out;
-       if (is_zone_device_page(page))
-               goto out_putpage;
-       if (PageAnon(page)) {
+       folio = folio_walk_start(&fw, vma, addr, 0);
+       if (folio) {
+               if (!folio_is_zone_device(folio) &&
+                   folio_test_anon(folio)) {
+                       folio_get(folio);
+                       page = fw.page;
+               }
+               folio_walk_end(&fw, vma);
+       }
+out:
+       if (page) {
                flush_anon_page(vma, page, addr);
                flush_dcache_page(page);
-       } else {
-out_putpage:
-               put_page(page);
-out:
-               page = NULL;
        }
        mmap_read_unlock(mm);
        return page;