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

Reply via email to