* Re: [PATCH v3 03/40] mm/vma: introduce and use vma_[flags_]can_merge()
[not found] ` <20260917-b4-mmap-prepare-vma-flag-sanify-v3-3-4583d8a23bca@kernel.org>
@ 2026-09-24 16:38 ` Gregory Price
0 siblings, 0 replies; 7+ messages in thread
From: Gregory Price @ 2026-09-24 16:38 UTC (permalink / raw)
To: Lorenzo Stoakes (ARM)
Cc: Andrew Morton, linux-kernel, linux-doc, linux-usb, linux-rdma,
selinux, linux-sound, bpf, linux-scsi, linux-fbdev, dri-devel,
linux-trace-kernel, linux-perf-users, linux-arch, linux-fsdevel,
linux-arm-kernel, kvmarm, linuxppc-dev, kvm, kvm-riscv,
linux-riscv, linux-s390, sparclinux, fuse-devel
On Thu, Sep 17, 2026 at 05:22:12PM +0100, Lorenzo Stoakes (ARM) wrote:
> Replace the open-coded VMA_SPECIAL_FLAGS check in the VMA merge logic with
> two new functions vma_flags_can_merge() and vma_can_merge() and update the
> merge logic to use the former.
>
> This abstracts the check and expresses it in terms of the desired behaviour
> rather than an arbitrary and confusing VMA flag.
>
> This also lays the groundwork for making further improvements in VMA flag
> usage.
>
> Also update the userland VMA tests to reflect the change.
>
> No functional change intended.
>
> Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 04/40] mm: consistently validate VMA state after mmap[_prepare] hooks
[not found] ` <20260917-b4-mmap-prepare-vma-flag-sanify-v3-4-4583d8a23bca@kernel.org>
@ 2026-09-24 17:17 ` Gregory Price
2026-09-25 12:51 ` Lorenzo Stoakes (ARM)
0 siblings, 1 reply; 7+ messages in thread
From: Gregory Price @ 2026-09-24 17:17 UTC (permalink / raw)
To: Lorenzo Stoakes (ARM)
Cc: Andrew Morton, linux-kernel, linux-doc, linux-usb, linux-rdma,
selinux, linux-sound, bpf, linux-scsi, linux-fbdev, dri-devel,
linux-trace-kernel, linux-perf-users, linux-arch, linux-fsdevel,
linux-arm-kernel, kvmarm, linuxppc-dev, kvm, kvm-riscv,
linux-riscv, linux-s390, sparclinux, fuse-devel
On Thu, Sep 17, 2026 at 05:22:13PM +0100, Lorenzo Stoakes (ARM) wrote:
> static inline int mmap_file(struct file *file, struct vm_area_struct *vma)
> {
...
> + err = mmap_hook_validate(prev_start, prev_end, &prev_flags, vma);
> + if (unlikely(err)) {
> + vma->vm_start = prev_start;
> + vma->vm_end = prev_end;
> + vma_close(vma);
> }
> +
> + return err;
> }
>
I indepdeantly validated the sashiko report on this chunk. Seems like
close() should be deferred until after __map_new_file_vma() calls
unmap_region().
suggested fix is to drop vma_close() from mmap_file() and update the
cleanup in __mmap_new_file_vma()
if (error) {
UNMAP_STATE(unmap, vmi, vma, vma->vm_start, vma->vm_end,
map->prev, map->next);
vma_iter_set(vmi, vma->vm_end);
unmap_region(&unmap);
/* Release driver state only after its mappings are gone. */
vma_close(vma);
if (map_same_file(map))
fput(map->vm_file);
vma->vm_file = NULL;
return error;
}
Example race:
Thread A Thread B
mmap(MAP_FIXED, address A)
driver remap_pfn_range(A, page P)
load/store at known address A
hardware finds the new present PTE
validation fails
->close() frees page P
UAF
unmap_region()
TLB shootdown
With that fix
Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>
~Gregory
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 05/40] mm/vma: ensure mmap_prepare doesn't set actions on a mergeable vma
[not found] ` <20260917-b4-mmap-prepare-vma-flag-sanify-v3-5-4583d8a23bca@kernel.org>
@ 2026-09-24 18:00 ` Gregory Price
2026-09-25 9:51 ` Lorenzo Stoakes (ARM)
0 siblings, 1 reply; 7+ messages in thread
From: Gregory Price @ 2026-09-24 18:00 UTC (permalink / raw)
To: Lorenzo Stoakes (ARM)
Cc: Andrew Morton, linux-kernel, linux-doc, linux-usb, linux-rdma,
selinux, linux-sound, bpf, linux-scsi, linux-fbdev, dri-devel,
linux-trace-kernel, linux-perf-users, linux-arch, linux-fsdevel,
linux-arm-kernel, kvmarm, linuxppc-dev, kvm, kvm-riscv,
linux-riscv, linux-s390, sparclinux, fuse-devel
On Thu, Sep 17, 2026 at 05:22:14PM +0100, Lorenzo Stoakes (ARM) wrote:
> When a user requests an mmap_action be performed in mmap_prepare, this
> involves populating the VMA range with data.
>
> However, if the VMA is mergeable, it might then mistakenly be merged with
> another VMA without having populated the range.
>
> Every mmap action currently available sets VMA flags such that the VMA
> cannot be merged.
>
> However, to ensure that no future mmap action falls foul of this, assert
> that this is the case upon mmap_prepare validation.
>
> Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
> ---
> mm/vma.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/mm/vma.c b/mm/vma.c
> index d6ed10cefc8f..62f2ce1ad5a1 100644
> --- a/mm/vma.c
> +++ b/mm/vma.c
> @@ -2809,6 +2809,15 @@ static int mmap_validate(unsigned long prev_start, unsigned long prev_end,
> int mmap_prepare_validate(const struct vm_area_desc *prev_desc,
> const struct vm_area_desc *desc)
> {
> + /*
> + * It is not valid to execute mmap actions for VMAs which can be merged,
> + * as any such merge would leave portions of the mapping incorrectly
> + * unmapped.
> + */
> + if (vma_flags_can_merge(&desc->vma_flags) &&
> + WARN_ON_ONCE(desc->action.type != MMAP_NOTHING))
> + return -EINVAL;
> +
If you wanted to make this unit-testable, you could pull it out into a
separate function:
static bool mmap_action_is_valid(const struct vm_area_desc *desc)
{
return desc->action.type == MMAP_NOTHING ||
!vma_flags_can_merge(&desc->vma_flags);
}
then write:
if (WARN_ON_ONCE(!mmap_action_is_valid(desc)))
return -EINVAL;
And you can write a unit test directly against mmap_action_is_valid
otherwise
Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 05/40] mm/vma: ensure mmap_prepare doesn't set actions on a mergeable vma
2026-09-24 18:00 ` [PATCH v3 05/40] mm/vma: ensure mmap_prepare doesn't set actions on a mergeable vma Gregory Price
@ 2026-09-25 9:51 ` Lorenzo Stoakes (ARM)
0 siblings, 0 replies; 7+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-25 9:51 UTC (permalink / raw)
To: Gregory Price
Cc: Andrew Morton, linux-kernel, linux-doc, linux-usb, linux-rdma,
selinux, linux-sound, bpf, linux-scsi, linux-fbdev, dri-devel,
linux-trace-kernel, linux-perf-users, linux-arch, linux-fsdevel,
linux-arm-kernel, kvmarm, linuxppc-dev, kvm, kvm-riscv,
linux-riscv, linux-s390, sparclinux, fuse-devel
On Thu, Sep 24, 2026 at 02:00:18PM -0400, Gregory Price wrote:
> On Thu, Sep 17, 2026 at 05:22:14PM +0100, Lorenzo Stoakes (ARM) wrote:
> > When a user requests an mmap_action be performed in mmap_prepare, this
> > involves populating the VMA range with data.
> >
> > However, if the VMA is mergeable, it might then mistakenly be merged with
> > another VMA without having populated the range.
> >
> > Every mmap action currently available sets VMA flags such that the VMA
> > cannot be merged.
> >
> > However, to ensure that no future mmap action falls foul of this, assert
> > that this is the case upon mmap_prepare validation.
> >
> > Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
> > ---
> > mm/vma.c | 9 +++++++++
> > 1 file changed, 9 insertions(+)
> >
> > diff --git a/mm/vma.c b/mm/vma.c
> > index d6ed10cefc8f..62f2ce1ad5a1 100644
> > --- a/mm/vma.c
> > +++ b/mm/vma.c
> > @@ -2809,6 +2809,15 @@ static int mmap_validate(unsigned long prev_start, unsigned long prev_end,
> > int mmap_prepare_validate(const struct vm_area_desc *prev_desc,
> > const struct vm_area_desc *desc)
> > {
> > + /*
> > + * It is not valid to execute mmap actions for VMAs which can be merged,
> > + * as any such merge would leave portions of the mapping incorrectly
> > + * unmapped.
> > + */
> > + if (vma_flags_can_merge(&desc->vma_flags) &&
> > + WARN_ON_ONCE(desc->action.type != MMAP_NOTHING))
> > + return -EINVAL;
> > +
>
> If you wanted to make this unit-testable, you could pull it out into a
> separate function:
>
> static bool mmap_action_is_valid(const struct vm_area_desc *desc)
> {
> return desc->action.type == MMAP_NOTHING ||
> !vma_flags_can_merge(&desc->vma_flags);
> }
>
> then write:
>
> if (WARN_ON_ONCE(!mmap_action_is_valid(desc)))
> return -EINVAL;
>
> And you can write a unit test directly against mmap_action_is_valid
You mean to isolate this check specifically?
All of the functions in vma.c are unit-testable in the userland VMA tests,
obviously here you'd be testing further stuff but you could certainly assert a
mergeable VMA specifying an action should result in an error there.
I'm also keen not to proliferate two many 'kinds' of validation.
As mmap_validate() checks pretty much everything BUT the action check, and it
has to work across mmap_prepare and mmap hooks.
So the idea here is we put the mmap_prepare-specific stuff in
mmap_prepare_validate() and the shared stuff in mmap_validate().
And already the stuff that can be validated just against flags lives in
mmap_validate_vma_flags() so that is itself separated out nicely.
>
> otherwise
>
> Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>
Thanks!
--
Cheers, Lorenzo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 04/40] mm: consistently validate VMA state after mmap[_prepare] hooks
2026-09-24 17:17 ` [PATCH v3 04/40] mm: consistently validate VMA state after mmap[_prepare] hooks Gregory Price
@ 2026-09-25 12:51 ` Lorenzo Stoakes (ARM)
0 siblings, 0 replies; 7+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-25 12:51 UTC (permalink / raw)
To: Gregory Price
Cc: Andrew Morton, linux-kernel, linux-doc, linux-usb, linux-rdma,
selinux, linux-sound, bpf, linux-scsi, linux-fbdev, dri-devel,
linux-trace-kernel, linux-perf-users, linux-arch, linux-fsdevel,
linux-arm-kernel, kvmarm, linuxppc-dev, kvm, kvm-riscv,
linux-riscv, linux-s390, sparclinux, fuse-devel
On Thu, Sep 24, 2026 at 01:17:28PM -0400, Gregory Price wrote:
> On Thu, Sep 17, 2026 at 05:22:13PM +0100, Lorenzo Stoakes (ARM) wrote:
> > static inline int mmap_file(struct file *file, struct vm_area_struct *vma)
> > {
> ...
> > + err = mmap_hook_validate(prev_start, prev_end, &prev_flags, vma);
> > + if (unlikely(err)) {
> > + vma->vm_start = prev_start;
> > + vma->vm_end = prev_end;
> > + vma_close(vma);
> > }
> > +
> > + return err;
> > }
> >
>
> I indepdeantly validated the sashiko report on this chunk. Seems like
> close() should be deferred until after __map_new_file_vma() calls
> unmap_region().
Ack perhaps too quickly dismissed that one...!
>
> suggested fix is to drop vma_close() from mmap_file() and update the
> cleanup in __mmap_new_file_vma()
>
> if (error) {
> UNMAP_STATE(unmap, vmi, vma, vma->vm_start, vma->vm_end,
> map->prev, map->next);
> vma_iter_set(vmi, vma->vm_end);
> unmap_region(&unmap);
>
> /* Release driver state only after its mappings are gone. */
> vma_close(vma);
>
> if (map_same_file(map))
> fput(map->vm_file);
> vma->vm_file = NULL;
>
> return error;
> }
>
> Example race:
>
> Thread A Thread B
>
> mmap(MAP_FIXED, address A)
> driver remap_pfn_range(A, page P)
> load/store at known address A
> hardware finds the new present PTE
> validation fails
> ->close() frees page P
> UAF
> unmap_region()
> TLB shootdown
>
> With that fix
Ack, yeah. It's kind of a situation that should never happen, but if validation
is supposed to actually be run against things then we should keep the kernel
stable when we do it :)
Will apply for the respin.
>
> Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>
Thanks!
>
> ~Gregory
>
--
Cheers, Lorenzo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 06/40] mm: make map_kernel_pages_[prepare,complete] internal and unexported
[not found] ` <20260917-b4-mmap-prepare-vma-flag-sanify-v3-6-4583d8a23bca@kernel.org>
@ 2026-09-29 15:58 ` Gregory Price
0 siblings, 0 replies; 7+ messages in thread
From: Gregory Price @ 2026-09-29 15:58 UTC (permalink / raw)
To: Lorenzo Stoakes (ARM)
Cc: Andrew Morton, linux-kernel, linux-doc, linux-usb, linux-rdma,
selinux, linux-sound, bpf, linux-scsi, linux-fbdev, dri-devel,
linux-trace-kernel, linux-perf-users, linux-arch, linux-fsdevel,
linux-arm-kernel, kvmarm, linuxppc-dev, kvm, kvm-riscv,
linux-riscv, linux-s390, sparclinux, fuse-devel
On Thu, Sep 17, 2026 at 05:22:15PM +0100, Lorenzo Stoakes (ARM) wrote:
> There's no reason to export the symbols for these functions which are only
> called from internal mm logic, additionally there's no reason for them to
> be declared in mm.h.
>
> This patch therefore removes the exports and moves the declarations to
> mm/internal.h.
>
> No functional change intended.
>
> Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 07/40] mm/vma: tidy up map kernel pages enum values
[not found] ` <20260917-b4-mmap-prepare-vma-flag-sanify-v3-7-4583d8a23bca@kernel.org>
@ 2026-09-29 15:59 ` Gregory Price
0 siblings, 0 replies; 7+ messages in thread
From: Gregory Price @ 2026-09-29 15:59 UTC (permalink / raw)
To: Lorenzo Stoakes (ARM)
Cc: Andrew Morton, linux-mm, linux-kernel, linux-doc, linux-usb,
linux-rdma, selinux, linux-sound, bpf, linux-scsi, linux-fbdev,
dri-devel, linux-trace-kernel, linux-perf-users, linux-arch,
linux-fsdevel, linux-arm-kernel, kvmarm, linuxppc-dev, kvm,
kvm-riscv, linux-riscv, linux-s390, sparclinux, fuse-devel
On Thu, Sep 17, 2026 at 05:22:16PM +0100, Lorenzo Stoakes (ARM) wrote:
> MMAP_MAP_KERNEL_PAGES is a mouthful, discard the MAP_ as that's implied by
> MMAP.
>
> Also while we're here delete useless comments for mmap actions whose names
> clearly indicate what they are for.
>
> Also update the userland VMA tests to reflect this change.
>
> No functional change intended.
>
> Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-09-29 15:59 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260917-b4-mmap-prepare-vma-flag-sanify-v3-0-4583d8a23bca@kernel.org>
[not found] ` <20260917-b4-mmap-prepare-vma-flag-sanify-v3-3-4583d8a23bca@kernel.org>
2026-09-24 16:38 ` [PATCH v3 03/40] mm/vma: introduce and use vma_[flags_]can_merge() Gregory Price
[not found] ` <20260917-b4-mmap-prepare-vma-flag-sanify-v3-4-4583d8a23bca@kernel.org>
2026-09-24 17:17 ` [PATCH v3 04/40] mm: consistently validate VMA state after mmap[_prepare] hooks Gregory Price
2026-09-25 12:51 ` Lorenzo Stoakes (ARM)
[not found] ` <20260917-b4-mmap-prepare-vma-flag-sanify-v3-5-4583d8a23bca@kernel.org>
2026-09-24 18:00 ` [PATCH v3 05/40] mm/vma: ensure mmap_prepare doesn't set actions on a mergeable vma Gregory Price
2026-09-25 9:51 ` Lorenzo Stoakes (ARM)
[not found] ` <20260917-b4-mmap-prepare-vma-flag-sanify-v3-6-4583d8a23bca@kernel.org>
2026-09-29 15:58 ` [PATCH v3 06/40] mm: make map_kernel_pages_[prepare,complete] internal and unexported Gregory Price
[not found] ` <20260917-b4-mmap-prepare-vma-flag-sanify-v3-7-4583d8a23bca@kernel.org>
2026-09-29 15:59 ` [PATCH v3 07/40] mm/vma: tidy up map kernel pages enum values Gregory Price
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox