diff options
author | Lokesh Gidra <lokeshgidra@google.com> | 2024-03-21 16:58:18 -0700 |
---|---|---|
committer | Lokesh Gidra <lokeshgidra@google.com> | 2024-04-22 18:09:14 +0000 |
commit | 8dd482be44dcf8530b75f5572707363a101ff1ea (patch) | |
tree | 2f31a082a875de34689c482d15be6fc8a270c180 | |
parent | ce2896c0c6a5777721bdc703b1b89b1760e79854 (diff) | |
download | common-8dd482be44dcf8530b75f5572707363a101ff1ea.tar.gz |
UPSTREAM: userfaultfd: fix deadlock warning when locking src and dst VMAs
Use down_read_nested() to avoid the warning.
Link: https://lkml.kernel.org/r/20240321235818.125118-1-lokeshgidra@google.com
Fixes: 867a43a34ff8 ("userfaultfd: use per-vma locks in userfaultfd operations")
Reported-by: syzbot+49056626fe41e01f2ba7@syzkaller.appspotmail.com
Signed-off-by: Lokesh Gidra <lokeshgidra@google.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Brian Geffon <bgeffon@google.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Hillf Danton <hdanton@sina.com>
Cc: Jann Horn <jannh@google.com> [Bug #2]
Cc: Kalesh Singh <kaleshsingh@google.com>
Cc: Lokesh Gidra <lokeshgidra@google.com>
Cc: Mike Rapoport (IBM) <rppt@kernel.org>
Cc: Nicolas Geoffray <ngeoffray@google.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
(cherry picked from commit 30af24facf0aed12dec23bdf6eac6a907f88306a)
Bug: 320478828
Change-Id: I56d7e33878d6248bba28e1e4204e2b9005d87e4d
Signed-off-by: Lokesh Gidra <lokeshgidra@google.com>
-rw-r--r-- | mm/userfaultfd.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index 99b0d56beb5d..dffa3fe756a6 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -1383,7 +1383,8 @@ static int uffd_move_lock(struct mm_struct *mm, */ down_read(&(*dst_vmap)->vm_lock->lock); if (*dst_vmap != *src_vmap) - down_read(&(*src_vmap)->vm_lock->lock); + down_read_nested(&(*src_vmap)->vm_lock->lock, + SINGLE_DEPTH_NESTING); } mmap_read_unlock(mm); return err; |