Re: [PATCH 06/19] mm/pagewalk: Check pfnmap early for folio_walk_start()

Peter Xu
2024-08-09T16:54:09Z

On Fri, Aug 09, 2024 at 06:20:06PM +0200, David Hildenbrand wrote:
> On 09.08.24 18:08, Peter Xu wrote:
> > Pfnmaps can always be identified with special bits in the ptes/pmds/puds.
> > However that's unnecessary if the vma is stable, and when it's mapped under
> > VM_PFNMAP | VM_IO.
> >
> > Instead of adding similar checks in all the levels for huge pfnmaps, let
> > folio_walk_start() fail even earlier for these mappings. It's also
> > something gup-slow already does, so make them match.
> >
> > Cc: David Hildenbrand <david@redhat.com>
> > Signed-off-by: Peter Xu <peterx@redhat.com>
> > ---
> > mm/pagewalk.c | 5 +++++
> > 1 file changed, 5 insertions(+)
> >
> > diff --git a/mm/pagewalk.c b/mm/pagewalk.c
> > index cd79fb3b89e5..fd3965efe773 100644
> > --- a/mm/pagewalk.c
> > +++ b/mm/pagewalk.c
> > @@ -727,6 +727,11 @@ struct folio *folio_walk_start(struct folio_walk *fw,
> > p4d_t *p4dp;
> > mmap_assert_locked(vma->vm_mm);
> > +
> > + /* It has no folio backing the mappings at all.. */
> > + if (vma->vm_flags & (VM_IO | VM_PFNMAP))
> > + return NULL;
> > +
>
> That is in general not what we want, and we still have some places that
> wrongly hard-code that behavior.
>
> In a MAP_PRIVATE mapping you might have anon pages that we can happily walk.
>
> vm_normal_page() / vm_normal_page_pmd() [and as commented as a TODO,
> vm_normal_page_pud()] should be able to identify PFN maps and reject them,
> no?

Yep, I think we can also rely on special bit.

When I was working on this whole series I must confess I am already
confused on the real users of MAP_PRIVATE pfnmaps. E.g. we probably don't
need either PFNMAP for either mprotect/fork/... at least for our use case,
then VM_PRIVATE is even one step further.

Here I chose to follow gup-slow, and I suppose you meant that's also wrong?
If so, would it make sense we keep them aligned as of now, and change them
altogether? Or do you think we should just rely on the special bits?

And, just curious: is there any use case you're aware of that can benefit
from caring PRIVATE pfnmaps yet so far, especially in this path?

As far as I read, none of folio_walk_start() users so far should even
stumble on top of a pfnmap, share or private. But that's a fairly quick
glimps only. IOW, I was wondering whether I'm just over cautious here.

Thanks,

--
Peter Xu