From: "Kiryl Shutsemau (Meta)" <[email protected]> Callers that want the folio behind a present PTE spell it out as page_folio(pte_page(pte)).
Add pte_folio() as the folio companion to pte_page(), and convert the callers in fs/proc/task_mmu.c and mm/hugetlb.c. Preparation for the anonymous collapse engine, which reads the folio behind a PTE in several places. Assisted-by: Claude-Code:claude-opus-5 Signed-off-by: Kiryl Shutsemau (Meta) <[email protected]> --- fs/proc/task_mmu.c | 4 ++-- include/linux/mm.h | 14 ++++++++++++++ mm/hugetlb.c | 8 ++++---- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 5c54aebe2118..459c779b8141 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1277,7 +1277,7 @@ static int smaps_hugetlb_range(pte_t *pte, unsigned long hmask, ptl = huge_pte_lock(hstate_vma(vma), walk->mm, pte); ptent = huge_ptep_get(walk->mm, addr, pte); if (pte_present(ptent)) { - folio = page_folio(pte_page(ptent)); + folio = pte_folio(ptent); present = true; } else { const softleaf_t entry = softleaf_from_pte(ptent); @@ -2227,7 +2227,7 @@ static int pagemap_hugetlb_range(pte_t *ptep, unsigned long hmask, ptl = huge_pte_lock(hstate_vma(vma), walk->mm, ptep); pte = huge_ptep_get(walk->mm, addr, ptep); if (pte_present(pte)) { - struct folio *folio = page_folio(pte_page(pte)); + struct folio *folio = pte_folio(pte); if (!folio_test_anon(folio)) flags |= PM_FILE; diff --git a/include/linux/mm.h b/include/linux/mm.h index 0829e0d3b2d1..eb44e3dfee09 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2681,6 +2681,20 @@ static inline pte_t mk_pte(const struct page *page, pgprot_t pgprot) return pfn_pte(page_to_pfn(page), pgprot); } +/** + * pte_folio - Return the folio mapped by a present PTE. + * @pte: A present page table entry. + * + * The folio companion to pte_page(); only meaningful for a present PTE + * that maps a struct-page-backed folio. + * + * Return: The folio containing the page @pte maps. + */ +static inline struct folio *pte_folio(pte_t pte) +{ + return page_folio(pte_page(pte)); +} + /** * folio_mk_pte - Create a PTE for this folio * @folio: The folio to create a PTE for diff --git a/mm/hugetlb.c b/mm/hugetlb.c index dded1768193a..bceab8e14118 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -5280,7 +5280,7 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma, * are about to unmap is the actual folio of interest. */ if (folio_provided) { - if (folio != page_folio(pte_page(pte))) { + if (folio != pte_folio(pte)) { spin_unlock(ptl); continue; } @@ -5291,7 +5291,7 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma, */ set_vma_resv_flags(vma, HPAGE_RESV_UNMAPPED); } else { - folio = page_folio(pte_page(pte)); + folio = pte_folio(pte); } pte = huge_ptep_get_and_clear(mm, address, ptep, sz); @@ -5514,7 +5514,7 @@ static vm_fault_t hugetlb_wp(struct vm_fault *vmf) return 0; } - old_folio = page_folio(pte_page(pte)); + old_folio = pte_folio(pte); delayacct_wpcopy_start(); @@ -6189,7 +6189,7 @@ vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, * checks whether we can re-use the folio exclusively * for us in case we are the only user of it. */ - folio = page_folio(pte_page(vmf.orig_pte)); + folio = pte_folio(vmf.orig_pte); if (folio_test_anon(folio) && !folio_trylock(folio)) { need_wait_lock = true; goto out_ptl; -- 2.54.0
