Messages in this thread Patch in this message | | | Date | Sat, 9 Jan 2016 01:23:52 +0200 | From | "Kirill A. Shutemov" <> | Subject | Re: mm: possible deadlock in mm_take_all_locks |
| |
On Fri, Jan 08, 2016 at 05:58:33PM +0100, Dmitry Vyukov wrote: > Hello, > > I've hit the following deadlock warning while running syzkaller fuzzer > on commit b06f3a168cdcd80026276898fd1fee443ef25743. As far as I > understand this is a false positive, because both call stacks are > protected by mm_all_locks_mutex.
+Michal
I don't think it's false positive.
The reason we don't care about order of taking i_mmap_rwsem is that we never takes i_mmap_rwsem under other i_mmap_rwsem, but that's not true for i_mmap_rwsem vs. hugetlbfs_i_mmap_rwsem_key. That's why we have the annotation in the first place.
See commit b610ded71918 ("hugetlb: fix lockdep splat caused by pmd sharing").
Consider totally untested patch below.
diff --git a/mm/mmap.c b/mm/mmap.c index 2ce04a649f6b..63aefcf409e1 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -3203,7 +3203,16 @@ int mm_take_all_locks(struct mm_struct *mm) for (vma = mm->mmap; vma; vma = vma->vm_next) { if (signal_pending(current)) goto out_unlock; - if (vma->vm_file && vma->vm_file->f_mapping) + if (vma->vm_file && vma->vm_file->f_mapping && + !is_vm_hugetlb_page(vma)) + vm_lock_mapping(mm, vma->vm_file->f_mapping); + } + + for (vma = mm->mmap; vma; vma = vma->vm_next) { + if (signal_pending(current)) + goto out_unlock; + if (vma->vm_file && vma->vm_file->f_mapping && + is_vm_hugetlb_page(vma)) vm_lock_mapping(mm, vma->vm_file->f_mapping); } -- Kirill A. Shutemov
| |