diff --git a/mm/memory.c b/mm/memory.c index 282203363177..2f4b4322ec0e 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -1817,6 +1817,7 @@ static void unmap_single_vma(struct mmu_gather *tlb, { unsigned long start = max(vma->vm_start, start_addr); unsigned long end; + bool mm_read_locked; if (start >= vma->vm_end) return; @@ -1829,11 +1830,11 @@ static void unmap_single_vma(struct mmu_gather *tlb, if (unlikely(vma->vm_flags & VM_PFNMAP)) { if (!mm_wr_locked) - mmap_read_lock(vma->vm_mm); + mm_read_locked = !mmap_read_trylock(vma->vm_mm); untrack_pfn(vma, 0, 0, mm_wr_locked); - if (!mm_wr_locked) + if (!mm_wr_locked && !mm_read_locked) mmap_read_unlock(vma->vm_mm); } This seems to fix the issue without completely removing the locking. Bert Karwatzki