• Suren Baghdasaryan's avatar
    userfaultfd: fix move_pages_pte() splitting folio under RCU read lock · 982ae058
    Suren Baghdasaryan authored
    While testing the split PMD path with lockdep enabled I've got an "Invalid
    wait context" error caused by split_huge_page_to_list() trying to lock
    anon_vma->rwsem while inside RCU read section.  The issues is due to
    move_pages_pte() calling split_folio() under RCU read lock.  Fix this by
    unmapping the PTEs and exiting RCU read section before splitting the folio
    and then retrying.  The same retry pattern is used when locking the folio
    or anon_vma in this function.  After splitting the large folio we unlock
    and release it because after the split the old folio might not be the one
    that contains the src_addr.
    
    Link: https://lkml.kernel.org/r/20240102233256.1077959-1-surenb@google.com
    Fixes: adef4406
    
     ("userfaultfd: UFFDIO_MOVE uABI")
    Signed-off-by: default avatarSuren Baghdasaryan <surenb@google.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Brian Geffon <bgeffon@google.com>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Jann Horn <jannh@google.com>
    Cc: Kalesh Singh <kaleshsingh@google.com>
    Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Lokesh Gidra <lokeshgidra@google.com>
    Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Mike Rapoport (IBM) <rppt@kernel.org>
    Cc: Nicolas Geoffray <ngeoffray@google.com>
    Cc: Ryan Roberts <ryan.roberts@arm.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: ZhangPeng <zhangpeng362@huawei.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    982ae058
userfaultfd.c 38.4 KB