Re: [PATCH v4] mm: Use a folio in the softleaf_is_device_private path
From: Lorenzo Stoakes (ARM)
Date: Tue Aug 18 2026 - 04:57:17 EST
On Tue, Aug 18, 2026 at 09:30:40AM +0200, David Hildenbrand (Arm) wrote:
> On 8/18/26 04:13, Hongfu Li wrote:
> >>> So after migrate_to_ram() the folio might have been split or otherwise somehow
> >>> the page doesn't belong to the same locked, refcount-incremented folio it did
> >>> before?
> >>
> >> I suspect a split.
> >>
> >>>
> >>> That's kinda a footgun... but this documents it at least.
> >>>
> >>> I think a comment explaining how this can happen would be helpful though as this
> >>> doesn't seem intuitive.
> >>
> >> I think, conceptually, calling into something that consumes a page (vmf->page)
> >> always needs care when operating on folios.
> >>
> >> Passing the vmf to some callback might be the odd thing here, because the
> >> vmf->page contract is not really clear.
> >
> > I'm very sorry for introducing this regression.
> > Thank you for identifying and testing this issue.
> >
> > I will double-check this code path and apply your fix to run further
> > tests locally.
> >
> > Would it make sense to add a comment here like the below, to make this
> > subtle behavior clearer for future readers?
> >
> > diff --git a/mm/memory.c b/mm/memory.c
> > index 4134ac607ee0..2b6d6c863ecb 100644
> > --- a/mm/memory.c
> > +++ b/mm/memory.c
> > @@ -4937,6 +4937,12 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
> > pte_unmap_unlock(vmf->pte, vmf->ptl);
> > pgmap = page_pgmap(vmf->page);
> > ret = pgmap->ops->migrate_to_ram(vmf);
> > + /*
> > + * migrate_to_ram() can split a large folio, updating
> > + * vmf->page to a different folio. Re-fetch folio for
> > + * correct unlock/put.
> > + */
>
> "migrate_to_ram() might have split the folio."
>
> Should be sufficient I guess.
Agreed, no need for a schloppy long comment here!
/* migrate_to_ram() might have split the folio. */
folio = page_folio(vmf->page);
Should be fine.
The commit message should be updated to reflect it too and mention that we are
going from 4 -> 2 compound_head()'s now.
>
> --
> Cheers,
>
> David
--
Cheers, Lorenzo