]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
mm: Fix some minor per-VMA lock issues in userfaultfd
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 12 Apr 2024 15:32:43 +0000 (11:32 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 12 Apr 2024 16:01:58 +0000 (12:01 -0400)
Rename lock_vma() to uffd_lock_vma() because it really is uffd specific.
Remove comment referencing unlock_vma() which doesn't exist.
Fix the comment about lock_vma_under_rcu() which I just made incorrect.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
mm/userfaultfd.c

index 3c3539c573e7fec47b2ac883e18d7644d40197c3..a892b8a91d9eae31f738213749d8bab759304bbc 100644 (file)
@@ -56,17 +56,16 @@ struct vm_area_struct *find_vma_and_prepare_anon(struct mm_struct *mm,
 
 #ifdef CONFIG_PER_VMA_LOCK
 /*
- * lock_vma() - Lookup and lock vma corresponding to @address.
+ * uffd_lock_vma() - Lookup and lock vma corresponding to @address.
  * @mm: mm to search vma in.
  * @address: address that the vma should contain.
  *
- * Should be called without holding mmap_lock. vma should be unlocked after use
- * with unlock_vma().
+ * Should be called without holding mmap_lock.
  *
  * Return: A locked vma containing @address, -ENOENT if no vma is found, or
  * -ENOMEM if anon_vma couldn't be allocated.
  */
-static struct vm_area_struct *lock_vma(struct mm_struct *mm,
+static struct vm_area_struct *uffd_lock_vma(struct mm_struct *mm,
                                       unsigned long address)
 {
        struct vm_area_struct *vma;
@@ -74,9 +73,8 @@ static struct vm_area_struct *lock_vma(struct mm_struct *mm,
        vma = lock_vma_under_rcu(mm, address);
        if (vma) {
                /*
-                * lock_vma_under_rcu() only checks anon_vma for private
-                * anonymous mappings. But we need to ensure it is assigned in
-                * private file-backed vmas as well.
+                * We know we're going to need to use anon_vma, so check
+                * that early.
                 */
                if (!(vma->vm_flags & VM_SHARED) && unlikely(!vma->anon_vma))
                        vma_end_read(vma);
@@ -107,7 +105,7 @@ static struct vm_area_struct *uffd_mfill_lock(struct mm_struct *dst_mm,
 {
        struct vm_area_struct *dst_vma;
 
-       dst_vma = lock_vma(dst_mm, dst_start);
+       dst_vma = uffd_lock_vma(dst_mm, dst_start);
        if (IS_ERR(dst_vma) || validate_dst_vma(dst_vma, dst_start + len))
                return dst_vma;
 
@@ -1402,7 +1400,7 @@ static int uffd_move_lock(struct mm_struct *mm,
        struct vm_area_struct *vma;
        int err;
 
-       vma = lock_vma(mm, dst_start);
+       vma = uffd_lock_vma(mm, dst_start);
        if (IS_ERR(vma))
                return PTR_ERR(vma);
 
@@ -1417,7 +1415,7 @@ static int uffd_move_lock(struct mm_struct *mm,
        }
 
        /*
-        * Using lock_vma() to get src_vma can lead to following deadlock:
+        * Using uffd_lock_vma() to get src_vma can lead to following deadlock:
         *
         * Thread1                              Thread2
         * -------                              -------
@@ -1439,7 +1437,7 @@ static int uffd_move_lock(struct mm_struct *mm,
        err = find_vmas_mm_locked(mm, dst_start, src_start, dst_vmap, src_vmap);
        if (!err) {
                /*
-                * See comment in lock_vma() as to why not using
+                * See comment in uffd_lock_vma() as to why not using
                 * vma_start_read() here.
                 */
                down_read(&(*dst_vmap)->vm_lock->lock);