Re: [PATCH v2 1/4] mm: Introduce vm_uffd_ops API

Liam R. Howlett
2025-09-18T17:55:10Z

* Nikita Kalyazin <kalyazin@amazon.com> [250918 13:16]:

...
> > >
> > > Nevertheless, let's step back for a second and instead focus on the problem
> > > these patches are trying to solve, which is to allow guest_memfd implement
> > > UFFD_CONTINUE (or minor fault in other terminology).
> >
> > Well, this is about modularizing memory types, but the first user is
> > supposed to be the guest-memfd support.
> >
> > >
> > > This means uffd should be able to map a folio that's already in
> > > guest_memfd page cache to the faulted address. Obviously, the page table
> > > update happens in uffd. But it still has to find what to map and we need
> > > some way to let guest_memfd tell that to uffd.
> > >
> > > So we need a hook somewhere that will return a folio matching pgoff in
> > > vma->file->inode.
> > >
> > > Do you see a way to implement it otherwise?
> >
> > I must be missing something.
> >
> > UFFDIO_CONTINUE currently enters through an ioctl that calls
> > userfaultfd_continue() -> mfill_atomic_continue()... mfill_atomic() gets
> > and uses the folio to actually do the work. Right now, we don't hand
> > out the folio, so what is different here?
> >
> > I am under the impression that we don't need to return the folio, but
> > may need to do work on it. That is, we can give the mm side what it
> > needs to call the related memory type functions to service the request.
> >
> > For example, one could pass in the inode, pgoff, and memory type and the
> > mm code could then call the fault handler for that memory type?
> >
> > I didn't think Nikita had a folio returned in his first three patches
> > [1], but then they built on other patches and it was difficult to follow
> > along. Is it because that interface was agreed on in a call on 23 Jan
> > 2025 [2], as somewhat unclearly stated in [1]?
>
> I believe you can safely ignore what was discussed in [2] as it is
> irrelevant to this discussion. That was just reasoning why it was possible
> to use UserfaultFD for guest_memfd as opposed to inventing an alternative
> solution to handling faults in userspace.
>
> Regarding returning a folio, [1] was calling vm_ops->fault() in UserfaultFD
> code. The fault() itself gets a folio (at least in guest_memfd
> implementation [3]). Does it look like a preferable solution to you?

I think this answers my question.. but I want to be sure. Does that
mean you were getting the folio and doing the work in uffd without
returning the uffd? I tried to get those patches, but they didn't apply
for me.

What I want to do is limit the "memory type" that we support by
restricting what is done to service the fault, and handle that in mm
code (mm/uffd.c or whatever).

What we get is more people using the same fault handler and thus more
eyes and testing. Less code duplication.

Unless there is a technical reason we need more flexibility?

>
> The other patches it I was building on top were mmap support in guest_memfd
> [4], which is currently merged in kvm/next, and also part of [3].

Can we process it in the mm without returning the folio like the ioctl
does today, or is there a technical reason that won't work?

Thanks,
Liam