Re: [PATCH v4] mm: Use a folio in the softleaf_is_device_private path
"Lorenzo Stoakes (ARM)" <[email protected]>
| Newsgroups | gmane.linux.kernel,gmane.linux.kernel.mm |
|---|---|
| Message-ID | <aoQXk1PmUDD2hxZF@lucifer> |
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