| Message ID | 20261003-b4-mmap-prepare-vma-flag-sanify-v4-21-a1f052500fd7@kernel.org |
|---|---|
| State | New |
| Headers | show |
| Series | mm: make VMA flag semantics explicit, eliminate VM_SPECIAL | expand |
On Sat, Oct 3, 2026 at 6:40 PM Lorenzo Stoakes (ARM) <ljs@kernel.org> wrote: > > These are not MMIO pages so VMA_IO_BIT is an inappropriate flag to set. > > Instead, set them VMA_MIXEDMAP_BIT as they are kernel mappings and this is > the appropriate flag to set for those. > > This provides the semantics required - no VMA merging is permitted, but > does not prevent GUP. > > However this has no meaningful impact as these are refcounted and thus can > be GUPed. > > A previous commit already prevented __mm_populate() from being invoked on > XOL areas, which VMA_IO_BIT was previously relied upon to do, so that is no > longer required. > > Both VMAs set a VMA name, so always_dump_vma() returns true before > vma_dump_size() reaches its VMA_IO_BIT check, and thus there is no change > in core dump behaviour. > > Change this for both the core xol_add_vma() function and the x86-specific > get_uprobe_trampoline() function. > > Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org> Reviewed-by: Suren Baghdasaryan <surenb@google.com> > --- > arch/x86/kernel/uprobes.c | 2 +- > kernel/events/uprobes.c | 4 ++-- > 2 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c > index 65a2de82ecd2..0f60c0d076b6 100644 > --- a/arch/x86/kernel/uprobes.c > +++ b/arch/x86/kernel/uprobes.c > @@ -715,7 +715,7 @@ static struct vm_area_struct *get_uprobe_trampoline(struct mm_struct *mm, unsign > > *new_mapping = true; > return _install_special_mapping(mm, vaddr, PAGE_SIZE, > - VM_READ|VM_EXEC|VM_MAYEXEC|VM_MAYREAD|VM_IO, > + VM_READ|VM_EXEC|VM_MAYEXEC|VM_MAYREAD|VM_MIXEDMAP, > &tramp_mapping); > } > > diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c > index 7709ea882477..b89cc5cee002 100644 > --- a/kernel/events/uprobes.c > +++ b/kernel/events/uprobes.c > @@ -1726,8 +1726,8 @@ static int xol_add_vma(struct mm_struct *mm, struct xol_area *area) > } > > vma = _install_special_mapping(mm, area->vaddr, PAGE_SIZE, > - VM_EXEC|VM_MAYEXEC|VM_DONTCOPY|VM_IO| > - VM_SEALED_SYSMAP, > + VM_EXEC|VM_MAYEXEC|VM_DONTCOPY| > + VM_MIXEDMAP|VM_SEALED_SYSMAP, > &xol_mapping); > if (IS_ERR(vma)) { > ret = PTR_ERR(vma); > > -- > 2.55.0 >
diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c index 65a2de82ecd2..0f60c0d076b6 100644 --- a/arch/x86/kernel/uprobes.c +++ b/arch/x86/kernel/uprobes.c @@ -715,7 +715,7 @@ static struct vm_area_struct *get_uprobe_trampoline(struct mm_struct *mm, unsign *new_mapping = true; return _install_special_mapping(mm, vaddr, PAGE_SIZE, - VM_READ|VM_EXEC|VM_MAYEXEC|VM_MAYREAD|VM_IO, + VM_READ|VM_EXEC|VM_MAYEXEC|VM_MAYREAD|VM_MIXEDMAP, &tramp_mapping); } diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 7709ea882477..b89cc5cee002 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -1726,8 +1726,8 @@ static int xol_add_vma(struct mm_struct *mm, struct xol_area *area) } vma = _install_special_mapping(mm, area->vaddr, PAGE_SIZE, - VM_EXEC|VM_MAYEXEC|VM_DONTCOPY|VM_IO| - VM_SEALED_SYSMAP, + VM_EXEC|VM_MAYEXEC|VM_DONTCOPY| + VM_MIXEDMAP|VM_SEALED_SYSMAP, &xol_mapping); if (IS_ERR(vma)) { ret = PTR_ERR(vma);
These are not MMIO pages so VMA_IO_BIT is an inappropriate flag to set. Instead, set them VMA_MIXEDMAP_BIT as they are kernel mappings and this is the appropriate flag to set for those. This provides the semantics required - no VMA merging is permitted, but does not prevent GUP. However this has no meaningful impact as these are refcounted and thus can be GUPed. A previous commit already prevented __mm_populate() from being invoked on XOL areas, which VMA_IO_BIT was previously relied upon to do, so that is no longer required. Both VMAs set a VMA name, so always_dump_vma() returns true before vma_dump_size() reaches its VMA_IO_BIT check, and thus there is no change in core dump behaviour. Change this for both the core xol_add_vma() function and the x86-specific get_uprobe_trampoline() function. Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org> --- arch/x86/kernel/uprobes.c | 2 +- kernel/events/uprobes.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)