[PATCH v6 07/39] mm: assert mmap lock held, use new flags API in vm_insert_page[s]
Lorenzo Stoakes (ARM)
ljs at kernel.org
Tue Oct 13 08:04:47 PDT 2026
The existing logic asserts that an mmap write lock is held, bizarrely, by
asserting that an mmap_read_trylock() fails (which is not the same thing).
Assert the mmap write lock here and switch to using the new VMA flags API
while here.
Note that the vma_start_write() is explicitly broken out from
vm_flags_set() here in order to use vma_set_flags() safely.
Signed-off-by: Lorenzo Stoakes (ARM) <ljs at kernel.org>
---
mm/memory.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/mm/memory.c b/mm/memory.c
index 448342883e9d..a35cca09eb71 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2599,10 +2599,11 @@ int vm_insert_pages(struct vm_area_struct *vma, unsigned long addr,
if (!range_in_vma(vma, addr, end))
return -EFAULT;
- if (!(vma->vm_flags & VM_MIXEDMAP)) {
- VM_WARN_ON_ONCE(mmap_read_trylock(vma->vm_mm));
- VM_WARN_ON_ONCE(vma->vm_flags & VM_PFNMAP);
- vm_flags_set(vma, VM_MIXEDMAP);
+ if (!vma_test(vma, VMA_MIXEDMAP_BIT)) {
+ mmap_assert_write_locked(vma->vm_mm);
+ VM_WARN_ON_ONCE(vma_test(vma, VMA_PFNMAP_BIT));
+ vma_start_write(vma);
+ vma_set_flags(vma, VMA_MIXEDMAP_BIT);
}
/* Defer page refcount checking till we're about to map that page. */
return insert_pages(vma, addr, pages, num, vma->vm_page_prot);
@@ -2675,10 +2676,11 @@ int vm_insert_page(struct vm_area_struct *vma, unsigned long addr,
{
if (addr < vma->vm_start || addr >= vma->vm_end)
return -EFAULT;
- if (!(vma->vm_flags & VM_MIXEDMAP)) {
- BUG_ON(mmap_read_trylock(vma->vm_mm));
- BUG_ON(vma->vm_flags & VM_PFNMAP);
- vm_flags_set(vma, VM_MIXEDMAP);
+ if (!vma_test(vma, VMA_MIXEDMAP_BIT)) {
+ mmap_assert_write_locked(vma->vm_mm);
+ VM_WARN_ON_ONCE(vma_test(vma, VMA_PFNMAP_BIT));
+ vma_start_write(vma);
+ vma_set_flags(vma, VMA_MIXEDMAP_BIT);
}
return insert_page(vma, addr, page, vma->vm_page_prot, false);
}
--
2.55.0
More information about the kvm-riscv
mailing list