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) <[email protected]>
---
 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


Reply via email to