On 7/29/26 18:48, Lorenzo Stoakes (ARM) wrote: > This patch establishes fields within the vm_area_struct type to store the > anonymous page offset of VMAs.
Nit: Avoid "This patch". Just say "Establish ..." (I was surprised to find that even Documentation/process/submitting-patches.rst document this) > > The anonymous 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 anonymous > offset as a property of VMAs, we can now track them by their anonymous 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. > > 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. > > Given the relative time spent accessing reverse mapping fields as well as > updating them, there shouldn't be any performance impact here from false > sharing. > > Update the VMA userland tests to account for this change. > > No callsites are updated yet, so no functional change intended. > > Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]> > --- [...] > +static inline void __vma_set_anon_pgoff(struct vm_area_struct *vma, pgoff_t > pgoff) > +{ > +#ifdef CONFIG_64BIT > + vma->__vm_anon_pgoff_hi = pgoff >> 32; > +#endif > + vma->__vm_anon_pgoff_lo = pgoff & GENMASK(31, 0); > +} > + > +static inline void vma_set_anon_pgoff(struct vm_area_struct *vma, pgoff_t > pgoff) > +{ > + vma_assert_can_modify(vma); > + __vma_set_anon_pgoff(vma, pgoff); > +} > + > static inline void vma_add_pgoff(struct vm_area_struct *vma, pgoff_t delta) > { > vma_assert_can_modify(vma); > diff --git a/mm/vma_init.c b/mm/vma_init.c > index 715feee283f0..baa7e82f47e3 100644 > --- a/mm/vma_init.c > +++ b/mm/vma_init.c > @@ -51,6 +51,7 @@ static void vm_area_init_from(const struct vm_area_struct > *src, > dest->vm_end = src->vm_end; > dest->anon_vma = src->anon_vma; > dest->vm_pgoff = vma_start_pgoff(src); > + __vma_set_anon_pgoff(dest, vma_start_anon_pgoff(src)); It would be cleaner if both interfaces would either contain "start" or not contain it. The former would be better __vma_set_start_anon_pgoff(dest, vma_start_anon_pgoff(src)); Acked-by: David Hildenbrand (Arm) <[email protected]> -- Cheers, David

