[PATCH v5 04/38] mm/vma: ensure mmap_prepare doesn't set actions on a mergeable vma
Lorenzo Stoakes (ARM)
ljs at kernel.org
Fri Oct 9 11:03:58 PDT 2026
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.
Reviewed-by: Suren Baghdasaryan <surenb at google.com>
Reviewed-by: Zi Yan <ziy at nvidia.com>
Reviewed-by: Gregory Price (Meta) <gourry at gourry.net>
Acked-by: David Hildenbrand (Arm) <david at kernel.org>
Signed-off-by: Lorenzo Stoakes (ARM) <ljs at kernel.org>
---
mm/vma.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/mm/vma.c b/mm/vma.c
index cedc24dcdf3c..c067d6a4c826 100644
--- a/mm/vma.c
+++ b/mm/vma.c
@@ -2815,6 +2815,18 @@ static int mmap_validate(unsigned long orig_start, unsigned long orig_end,
int mmap_prepare_validate(const struct vm_area_desc *orig_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.
+ *
+ * This is checked after mmap_action_prepare(), as it may update the VMA
+ * flags and therefore whether the VMA can be merged.
+ */
+ if (vma_flags_can_merge(&desc->vma_flags) &&
+ WARN_ON_ONCE(desc->action.type != MMAP_NOTHING))
+ return -EINVAL;
+
return mmap_validate(orig_desc->start, orig_desc->end,
desc->start, desc->end,
&orig_desc->vma_flags, &desc->vma_flags);
--
2.55.0
More information about the kvm-riscv
mailing list