Re: [PATCH v4 4/5] ksm: Optimize rmap_walk_ksm by passing a suitable address range
From: xu.xin16
Date: Fri May 15 2026 - 03:14:44 EST
> > diff --git a/mm/ksm.c b/mm/ksm.c
> > index 0299a53ba7c9..a13184d00759 100644
> > --- a/mm/ksm.c
> > +++ b/mm/ksm.c
> > @@ -3200,6 +3200,7 @@ void rmap_walk_ksm(struct folio *folio, struct rmap_walk_control *rwc)
> > hlist_for_each_entry(rmap_item, &stable_node->hlist, hlist) {
> > /* Ignore the stable/unstable/sqnr flags */
> > const unsigned long addr = rmap_item->address & PAGE_MASK;
> > + const unsigned long vm_pgoff = rmap_item->vm_pgoff;
> > struct anon_vma *anon_vma = rmap_item->anon_vma;
> > struct anon_vma_chain *vmac;
> > struct vm_area_struct *vma;
> > @@ -3213,8 +3214,12 @@ void rmap_walk_ksm(struct folio *folio, struct rmap_walk_control *rwc)
> > anon_vma_lock_read(anon_vma);
> > }
> >
> > + /*
> > + * Currently KSM folios are order-0 normal pages, so pgoff_end
> > + * should be the same as pgoff_start.
> > + */
> > anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root,
> > - 0, ULONG_MAX) {
> > + vm_pgoff, vm_pgoff) {
>
> But vm_pgoff would just correspond to the start of the VMA, not where the page
> is actually mapped?
>
> I'd assume you really want the linear page index of the original page?
Right. I've reconsidered and realized that using vm_pgoff is indeed unstable.
My initial idea was: as long as we can find the VMA that maps this page,
it's sufficient for anon_vma_interval_tree_foreach() to check whether
"vm_pgoff <= pgoff of the original page <= (vm_pgoff + vma_pages(v) - 1)".
However, the flaw here is that the VMA may be split(e.g., due to madvise or mprotect),
causing vma_pages(v) to change, thereby making this condition no longer satisfied.
Indeed, it's better to use the linear page index of the original page.
I'll send v5 to correct this.
>
> --
> Cheers,
>
> David
>