On Thu, Oct 01, 2026 at 02:36:40PM +0200, David Hildenbrand (Arm) wrote:
> On 9/17/26 18:22, Lorenzo Stoakes (ARM) wrote:
> > Rather than referring to VMA flags with uncertain meaning, add a new
> > predicate that explicitly describes what possession of the VMA_PFNMAP_BIT
> > or VMA_MIXEDMAP_BIT flags mean, and then refer to that function for
> > determining VMA mergeability.
> >
> > Either flag means the contents of the mapping are owned by the kernel,
> > usually a driver, rather than by the core mm: the memory may be MMIO,
> > kernel-allocated pages or even ordinary pages the driver maps itself, but
> > the core must not populate, reclaim, migrate, copy-on-write or merge the
> > range on its own initiative.
> >
> > We initially also include VMA_IO_BIT here, as by implication, these must be
> > kernel-owned. (mlock() also sets VMA_IO_BIT transiently on ordinary VMAs
> > while locking them, which is addressed later in this series.)
> >
> > However the intent is to in future remove this, as no mapping should be
> > marked as an I/O mapping without also being marked with VMA_PFNMAP_BIT.
> >
> > This forms the basis of further work intended to improve how we express VMA
> > properties such as this.
> >
> > Also update the VMA userland tests to reflect the change.
> >
> > No functional change intended.
>
> Of course I have to bitch about the naming :)

Yup :)

>
> Intuitively: kernel owned vs ... user owned?
>
> No, it's kernel owned vs core-mm owned.

I would say somebody who does:

        ptr = malloc(4096);

Would think of that memory as 'owned' by them in the sense that they
control the lifetime, they established its attributes, etc.

So indeed, vs. user-owned.

>
> Which implies core-mm is not part of the kernel?
>
> Yes, this is confusing. ;)

I think what you're missing here is what _creates_ or _establishes_ the mapping.

Intuitively, if I do:

        ptr = kmalloc(GFP_KERNEL);

I, whether I am in the core kernel, or a driver, or whatever own it in any
meaningful sense of the word.

I think the issue here is you're confusing this with other things like the
rmap and refcounting, etc.


>
> I assume you're coming from "map_kernel_pages*", but that's rather "kernel
> memory" and not "kernel owned".
>
> Usually we say "driver owned" when not talking about pagecache/anon. Or user 
> vs.
> kernel memory.

I think it would only add confusion:

VDSO/VVAR, perf ring buffers, shmem mapped via PFN map, uprobes, etc. are
all in this category and I doubt people would consider those driver-owned.

>
> So is it really all about "is this (excluding CoW) no ordinary user memory 
> that
> we would track through the rmap" ?

VMA_MIXEDMAP_BIT mappings can be refcounted and rmapped so that's not a
correct description.

The distinction is - who put them there and who's allowed to change them
and who owns the lifecycle.

>
> >
> > Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
> > ---
> >  include/linux/mm.h              | 56 
> > ++++++++++++++++++++++++++++++++++++++++-
> >  tools/testing/vma/include/dup.h | 29 ++++++++++++++++++++-
> >  2 files changed, 83 insertions(+), 2 deletions(-)
> >
> > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > index 2a92193ac6a5..cab29d6e15c1 100644
> > --- a/include/linux/mm.h
> > +++ b/include/linux/mm.h
> > @@ -1612,6 +1612,44 @@ static inline bool vma_is_shared_maywrite(const 
> > struct vm_area_struct *vma)
> >     return is_shared_maywrite(&vma->flags);
> >  }
> >
> > +/**
> > + * vma_flags_is_kernel_owned() - Do the specified VMA flags indicate that 
> > the
> > + * contents of the VMA are owned by the kernel rather than the core mm?
> > + * @flags: The VMA flags to test.
> > + *
> > + * A kernel-owned mapping is one whose contents are established and 
> > controlled
> > + * by the kernel, typically a driver, rather than by the core mm's fault 
> > and
> > + * rmap machinery.
> > + *
> > + * The mapping may be memory-mapped I/O, kernel-allocated pages or ordinary
> > + * pages the owner has chosen to map itself (shmem via a PFN map, for 
> > instance).
> > + *
> > + * In all cases the core mm must not populate, reclaim, migrate, 
> > copy-on-write
> > + * or merge it of its own accord.
> > + *
> > + * Pages mapped this way are not necessarily reference counted or map 
> > counted.
> > + *
> > + * Returns: true if the flags indicate a kernel-owned mapping.
> > + */
> > +static inline bool vma_flags_is_kernel_owned(const vma_flags_t *flags)
> > +{
> > +   return vma_flags_test_any(flags, VMA_PFNMAP_BIT, VMA_MIXEDMAP_BIT,
> > +                             VMA_IO_BIT);
>
> I thought we have cases where we drivers insert pages and neither set
> VMA_PFNMAP_BIT nor VMA_MIXEDMAP_BIT.

There were 4 - defio, cmt_speech, uprobes and the bpf arena, and I fixed
all of them :)

Other than the DAX-only case below of course.

It's not correct behaviour and part of the point of this series is to
structurally _forbid_ illegal behaviour by drivers.

>
> I assume vmf_insert_page_mkwrite() is fine because it is DAX doing it (should 
> we
> limit this interface to DAX?).

That is a DAX-only thing and DAX is precisely a case that should not be
kernel-owned (and isn't!)

This series actually fixes the FUSE case too, restricting this interface to
DAX only seems like a sensible follow up as well.

I could also add a patch to this series to do that too if you wanted?

--
Cheers, Lorenzo

Reply via email to