On Sun, Jul 19, 2026 at 11:55:42AM +0800, [email protected] wrote:
> > This patch establishes fields within the vm_area_struct type to store the
> > virtual page offset of VMAs.
> >
> > The virtual page offset of a VMA is equal to vma->vm_start >> PAGE_SHIFT if
> > they are unfaulted or were not remapped, otherwise it is equal to this
> > value at the point of first fault.
> >
> > Currently, anonymous folios belonging to CoW'd MAP_PRIVATE-mapped
> > file-backed VMAs are tracked by their file offset. By adding virtual offset
> > as a property of VMAs, we can now track them by their virtual page offset
> > instead.
> >
> > By tracking this, we provide the means by which to eliminate this
> > inconsistency, and more importantly lay the foundations for future work for
> > the scalable CoW anonymous rmap rework.
> >
> > This patch simply adds the fields and some simple helpers. Subsequent
> > patches will update mm code to make use of these fields correctly.
> >
> > The fields chosen are packed in the VMA such that, for 64-bit kernel
> > builds, no additional space is taken up.
>
> It is not necessarily true that no additional memory will be consumed, as it
> depends on whether the baseline kernel has CONFIG_PER_VMA_LOCK enabled.

We are moving to this being permanently enabled.

> Moreover, in the future evolution of mm, maintaining this benefit would
> require that the layout of struct vm_area_struct before __vm_virt_pgoff_lo
> remains unchanged, which seems impractical.

It isn't, we are very careful with this struct.

>
> My personal suggestion is: maybe we could simply add an unsigned long field,
> say vm_virt_pgoff, without worrying about the increased memory footprint for
> now. Additionally, it would be helpful to add some comments clarifying the
> difference between this new field and the existing vm_pgoff, to aid 
> understanding.

Nope that'd add 64 bytes per VMA for a typical usage which can add up to a lot.

>
> Thanks,
> Xu Xin
>
> >
> > The first field is present on cacheline 0 containing key VMA fields, and
> > the second on cacheline 3, which contains file-backed reverse mapping
> > fields.
> >
> >
> > Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
> > ---
> >  include/linux/mm.h              | 59 
> > +++++++++++++++++++++++++++++++++++++++++
> >  include/linux/mm_types.h        |  4 +++
> >  mm/vma.h                        | 14 ++++++++++
> >  mm/vma_init.c                   |  1 +
> >  tools/testing/vma/include/dup.h | 26 ++++++++++++++++++
> >  5 files changed, 104 insertions(+)
> >
> > +static inline pgoff_t vma_last_virt_pgoff(const struct vm_area_struct *vma)
> > +{
> > +   return vma_end_virt_pgoff(vma) - 1;
> > +}
> > +
> >  static inline unsigned long vma_desc_size(const struct vm_area_desc *desc)
> >  {
> >     return desc->end - desc->start;
> > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> > index 939b5ea8c9e0..2710628059b1 100644
> > --- a/include/linux/mm_types.h
> > +++ b/include/linux/mm_types.h
> > @@ -967,6 +967,7 @@ struct vm_area_struct {
> >      */
> >     unsigned int vm_lock_seq;
> >  #endif
> > +   unsigned int __vm_virt_pgoff_lo; /* Low 32-bits of virtual pgoff. */
> >     /*
> >      * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma
> >      * list, after a COW of one of the file pages.  A MAP_SHARED vma
> > @@ -1041,6 +1042,9 @@ struct vm_area_struct {
> >  #ifdef CONFIG_DEBUG_LOCK_ALLOC
> >     struct lockdep_map vmlock_dep_map;
> >  #endif
> > +#endif
> > +#ifdef CONFIG_64BIT
> > +   unsigned int __vm_virt_pgoff_hi;  /* High 32-bits of virtual pgoff. */
> >  #endif
> >

Cheers, Lorenzo

Reply via email to