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

From: Pedro Falcato

Date: Thu Jul 02 2026 - 07:59:48 EST


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.

Reviewed-by: Pedro Falcato <pfalcato@xxxxxxx>

--
Pedro