Rather than having to figure out the page index to use using
linear_page_index(), calculate it using PFN.

This is a more natural fit as the linear page index is immaterial to
determining the folio page index.

Derive the page index from the offset between migration entry PFN and folio
PFN - pvmw.pfn (set via DEFINE_FOLIO_VMA_WALK() which uses folio_pfn() to
obtain it).

Additionally remove a not so useful comment and clean the code layout up.

No functional change intended.

Suggested-by: David Hildenbrand (Arm) <[email protected]>
Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
---
 mm/migrate.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/mm/migrate.c b/mm/migrate.c
index d08eff028483..50d0b547bca3 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -356,16 +356,11 @@ static bool remove_migration_pte(struct folio *folio,
 
        while (page_vma_mapped_walk(&pvmw)) {
                rmap_t rmap_flags = RMAP_NONE;
-               pte_t old_pte;
-               pte_t pte;
+               unsigned long idx = 0;
                softleaf_t entry;
                struct page *new;
-               unsigned long idx = 0;
-
-               /* pgoff is invalid for ksm pages, but they are never large */
-               if (folio_test_large(folio) && !folio_test_hugetlb(folio))
-                       idx = linear_page_index(vma, pvmw.address) - pvmw.pgoff;
-               new = folio_page(folio, idx);
+               pte_t old_pte;
+               pte_t pte;
 
 #ifdef CONFIG_ARCH_HAS_PMD_SOFTLEAVES
                /* PMD-mapped THP migration entry */
@@ -381,14 +376,18 @@ static bool remove_migration_pte(struct folio *folio,
                                                pvmw.pte);
                else
                        old_pte = ptep_get(pvmw.pte);
+
+               entry = softleaf_from_pte(old_pte);
+               if (folio_test_large(folio) && !folio_test_hugetlb(folio))
+                       idx = softleaf_to_pfn(entry) - pvmw.pfn;
+
                if (rmap_walk_arg->map_unused_to_zeropage &&
                    try_to_map_unused_to_zeropage(&pvmw, folio, old_pte, idx))
                        continue;
 
                folio_get(folio);
+               new = folio_page(folio, idx);
                pte = mk_pte(new, READ_ONCE(vma->vm_page_prot));
-
-               entry = softleaf_from_pte(old_pte);
                if (!softleaf_is_migration_young(entry))
                        pte = pte_mkold(pte);
                if (folio_test_dirty(folio) && 
softleaf_is_migration_dirty(entry))

-- 
2.55.0


Reply via email to