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 <[email protected]> > --- > 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. Reviewed-by: Pedro Falcato <[email protected]> -- Pedro
