Re: [PATCH 22/30] mm/vma: move __install_special_mapping() to vma.c

From: Lorenzo Stoakes

Date: Tue Jul 07 2026 - 06:36:25 EST


On Thu, Jul 02, 2026 at 12:22:56PM +0100, Pedro Falcato wrote:
> On Mon, Jun 29, 2026 at 01:23:33PM +0100, Lorenzo Stoakes wrote:
> > This function is operating on VMAs and rightly belongs in vma.c, where it
> > can be subject to VMA userland testing and allows us to isolate it from the
> > rest of mm.
> >
> > The _install_special_mapping() function will remain in mmap.c as a wrapper,
> > since this is used by architecture-specific code.
> >
> > Doing so allows us to isolate more functions in vma.c for the same reasons.
> >
> > This forms part of work to allow for tracking MAP_PRIVATE file-backed
> > mappings by their anonymous virtual page offset, as doing so allows us to
> > isolate and keep code that interacts with this together.
> >
> > No functional change intended.
> >
> > Signed-off-by: Lorenzo Stoakes <ljs@xxxxxxxxxx>
> > ---
> > mm/mmap.c | 38 --------------------------------------
> > mm/vma.c | 38 ++++++++++++++++++++++++++++++++++++++
> > mm/vma.h | 5 +++++
> > 3 files changed, 43 insertions(+), 38 deletions(-)
> >
> > diff --git a/mm/mmap.c b/mm/mmap.c
> > index 2d09a57e3620..46174e706bbe 100644
> > --- a/mm/mmap.c
> > +++ b/mm/mmap.c
> > @@ -1447,44 +1447,6 @@ static vm_fault_t special_mapping_fault(struct vm_fault *vmf)
> > return VM_FAULT_SIGBUS;
> > }
> >
> > -static struct vm_area_struct *__install_special_mapping(
> > - struct mm_struct *mm,
> > - unsigned long addr, unsigned long len,
> > - vm_flags_t vm_flags, void *priv,
> > - const struct vm_operations_struct *ops)
> > -{
> > - int ret;
> > - struct vm_area_struct *vma;
> > -
> > - vma = vm_area_alloc(mm);
> > - if (unlikely(vma == NULL))
> > - return ERR_PTR(-ENOMEM);
> > -
> > - vma_set_range(vma, addr, addr + len, 0);
> > - vm_flags |= mm->def_flags | VM_DONTEXPAND;
> > - if (pgtable_supports_soft_dirty())
> > - vm_flags |= VM_SOFTDIRTY;
> > - vm_flags_init(vma, vm_flags & ~VM_LOCKED_MASK);
> > - vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
> > -
> > - vma->vm_ops = ops;
> > - vma->vm_private_data = priv;
> > -
> > - ret = insert_vm_struct(mm, vma);
> > - if (ret)
> > - goto out;
> > -
> > - vm_stat_account(mm, vma->vm_flags, len >> PAGE_SHIFT);
> > -
> > - perf_event_mmap(vma);
> > -
> > - return vma;
> > -
> > -out:
> > - vm_area_free(vma);
> > - return ERR_PTR(ret);
> > -}
> > -
> > bool vma_is_special_mapping(const struct vm_area_struct *vma,
> > const struct vm_special_mapping *sm)
> > {
> > diff --git a/mm/vma.c b/mm/vma.c
> > index cb7222e20c93..f4de706a2728 100644
> > --- a/mm/vma.c
> > +++ b/mm/vma.c
> > @@ -3399,3 +3399,41 @@ __weak unsigned long vma_mmu_pagesize(struct vm_area_struct *vma)
> > {
> > return vma_kernel_pagesize(vma);
> > }
> > +
> > +struct vm_area_struct *__install_special_mapping(
> > + struct mm_struct *mm,
> > + unsigned long addr, unsigned long len,
> > + vm_flags_t vm_flags, void *priv,
> > + const struct vm_operations_struct *ops)
> > +{
> > + int ret;
> > + struct vm_area_struct *vma;
> > +
> > + vma = vm_area_alloc(mm);
> > + if (unlikely(vma == NULL))
> > + return ERR_PTR(-ENOMEM);
> > +
> > + vma_set_range(vma, addr, addr + len, 0);
> > + vm_flags |= mm->def_flags | VM_DONTEXPAND;
> > + if (pgtable_supports_soft_dirty())
> > + vm_flags |= VM_SOFTDIRTY;
> > + vm_flags_init(vma, vm_flags & ~VM_LOCKED_MASK);
> > + vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
> > +
> > + vma->vm_ops = ops;
> > + vma->vm_private_data = priv;
> > +
> > + ret = insert_vm_struct(mm, vma);
> > + if (ret)
> > + goto out;
> > +
> > + vm_stat_account(mm, vma->vm_flags, len >> PAGE_SHIFT);
> > +
> > + perf_event_mmap(vma);
> > +
> > + return vma;
> > +
> > +out:
> > + vm_area_free(vma);
> > + return ERR_PTR(ret);
> > +}
> > diff --git a/mm/vma.h b/mm/vma.h
> > index 47fe35e5307e..14f026bf3be4 100644
> > --- a/mm/vma.h
> > +++ b/mm/vma.h
> > @@ -775,4 +775,9 @@ static inline bool map_deny_write_exec(const vma_flags_t *old,
> > }
> > #endif
> >
> > +struct vm_area_struct *__install_special_mapping(struct mm_struct *mm,
> > + unsigned long addr, unsigned long len,
> > + vm_flags_t vm_flags, void *priv,
> > + const struct vm_operations_struct *ops);
> > +
> > #endif /* __MM_VMA_H */
>
> I'm really annoyed that _install_special_mapping has a leading underscore.
> That's it.

Yeah it's horrible :)

>
> Reviewed-by: Pedro Falcato <pfalcato@xxxxxxx>

Thanks!

>
> --
> Pedro

Cheers, Lorenzo