Convert directly from a pmd to a folio without going through another
representation first.  For now this is just a slightly shorter way to
write it, but it might end up being more efficient later.
Link: https://lkml.kernel.org/r/20240326202833.523759-4-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
 #define pmd_pgtable(pmd) pmd_page(pmd)
 #endif
 
+#define pmd_folio(pmd) page_folio(pmd_page(pmd))
+
 /*
  * A page table page can be thought of an array like this: pXd_t[PTRS_PER_PxD]
  *
 
                goto out;
        }
 
-       folio = pfn_folio(pmd_pfn(orig_pmd));
+       folio = pmd_folio(orig_pmd);
        /*
         * If other processes are mapping this folio, we couldn't discard
         * the folio unless they all do MADV_FREE so let's skip the folio.
                if (pmd_protnone(*pmd))
                        goto unlock;
 
-               folio = page_folio(pmd_page(*pmd));
+               folio = pmd_folio(*pmd);
                toptier = node_is_toptier(folio_nid(folio));
                /*
                 * Skip scanning top tier node if normal numa
                 * It's safe to call pmd_page when folio is set because it's
                 * guaranteed that pmd is present.
                 */
-               if (folio && folio != page_folio(pmd_page(*pmd)))
+               if (folio && folio != pmd_folio(*pmd))
                        goto out;
                __split_huge_pmd_locked(vma, pmd, range.start, freeze);
        }
 
                        goto huge_unlock;
                }
 
-               folio = pfn_folio(pmd_pfn(orig_pmd));
+               folio = pmd_folio(orig_pmd);
 
                /* Do not interfere with other mappings of this folio */
                if (folio_likely_mapped_shared(folio))
 
                qp->nr_failed++;
                return;
        }
-       folio = pfn_folio(pmd_pfn(*pmd));
+       folio = pmd_folio(*pmd);
        if (is_huge_zero_folio(folio)) {
                walk->action = ACTION_CONTINUE;
                return;
 
                        goto out;
                if (is_huge_zero_pmd(*pmd))
                        goto out;
-               folio = page_folio(pmd_page(*pmd));
+               folio = pmd_folio(*pmd);
                if (vma->vm_flags & VM_LOCKED)
                        mlock_folio(folio);
                else
 
                        /* Check if we can move the pmd without splitting it. */
                        if (move_splits_huge_pmd(dst_addr, src_addr, src_start + len) ||
                            !pmd_none(dst_pmdval)) {
-                               struct folio *folio = pfn_folio(pmd_pfn(*src_pmd));
+                               struct folio *folio = pmd_folio(*src_pmd);
 
                                if (!folio || (!is_huge_zero_folio(folio) &&
                                               !PageAnonExclusive(&folio->page))) {