Update the page_vma_mapped_walk structure to track whether the pgoff being
tracked is an anonymous pgoff or not and update the comments to reflect
this.

This is necessary in order to determine the correct VMA page
offset in vma_address_end() when pvmw->nr_pages > 1.

Also document that pvmw->pgoff is meaningless for pvmw->nr_pages == 1 and
for KSM.

Do not set this field where pgoff is not specified.

This is laying the groundwork for eventually using anonymous page offsets
as the index for all anonymous folios.

No functional change intended.

Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
---
 include/linux/rmap.h | 4 +++-
 mm/rmap.c            | 2 ++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/include/linux/rmap.h b/include/linux/rmap.h
index 8dc0871e5f00..0574537a355c 100644
--- a/include/linux/rmap.h
+++ b/include/linux/rmap.h
@@ -864,13 +864,14 @@ struct page *make_device_exclusive(struct mm_struct *mm, 
unsigned long addr,
 struct page_vma_mapped_walk {
        unsigned long pfn;
        unsigned long nr_pages;
-       pgoff_t pgoff;
+       pgoff_t pgoff;  /* Only meaningful if nr_pages > 1 and not a KSM walk */
        struct vm_area_struct *vma;
        unsigned long address;
        pmd_t *pmd;
        pte_t *pte;
        spinlock_t *ptl;
        unsigned int flags;
+       bool pgoff_is_anon : 1;
 };
 
 #define DEFINE_FOLIO_VMA_WALK(name, _folio, _vma, _address, _flags)    \
@@ -881,6 +882,7 @@ struct page_vma_mapped_walk {
                .vma = _vma,                                            \
                .address = _address,                                    \
                .flags = _flags,                                        \
+               .pgoff_is_anon = folio_test_anon(_folio),               \
        }
 
 static inline void page_vma_mapped_walk_done(struct page_vma_mapped_walk *pvmw)
diff --git a/mm/rmap.c b/mm/rmap.c
index 5798427d007f..ab3f879454de 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -1240,6 +1240,7 @@ static bool mapping_wrprotect_range_one(struct folio 
*folio,
                .vma            = vma,
                .address        = address,
                .flags          = PVMW_SYNC,
+               .pgoff_is_anon  = false,
        };
 
        state->cleaned += page_vma_mkclean_one(&pvmw);
@@ -1317,6 +1318,7 @@ int pfn_mkclean_range(unsigned long pfn, unsigned long 
nr_pages, pgoff_t pgoff,
                .pgoff          = pgoff,
                .vma            = vma,
                .flags          = PVMW_SYNC,
+               .pgoff_is_anon  = false,
        };
 
        if (invalid_mkclean_vma(vma, NULL))

-- 
2.55.0


Reply via email to