]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm: tweak __vma_enter_locked()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Wed, 19 Nov 2025 04:26:35 +0000 (04:26 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 24 Nov 2025 23:08:55 +0000 (15:08 -0800)
Move the commentary on how __vma_enter_locked() behaves from the body of
__vma_start_write() to the head of __vma_enter_locked() and merge it with
the existing documentation.  Also add a call to
mmap_assert_write_locked().

Link: https://lkml.kernel.org/r/20251119042639.3937024-1-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/mmap_lock.c

index f2532af6208c015b05f6ab29cb6b9cca8679977c..e6e5570d1ec7b40eaf365640e29908b5684f33ea 100644 (file)
@@ -46,9 +46,9 @@ EXPORT_SYMBOL(__mmap_lock_do_trace_released);
 #ifdef CONFIG_MMU
 #ifdef CONFIG_PER_VMA_LOCK
 /*
- * Return value: 0 if vma detached,
- * 1 if vma attached with no readers,
- * -EINTR if signal received,
+ * __vma_enter_locked() returns 0 immediately if the vma is not
+ * attached, otherwise it waits for any current readers to finish and
+ * returns 1.  Returns -EINTR if a signal is received while waiting.
  */
 static inline int __vma_enter_locked(struct vm_area_struct *vma,
                bool detaching, int state)
@@ -56,6 +56,8 @@ static inline int __vma_enter_locked(struct vm_area_struct *vma,
        int err;
        unsigned int tgt_refcnt = VMA_LOCK_OFFSET;
 
+       mmap_assert_write_locked(vma->vm_mm);
+
        /* Additional refcnt if the vma is attached. */
        if (!detaching)
                tgt_refcnt++;
@@ -91,11 +93,6 @@ int __vma_start_write(struct vm_area_struct *vma, unsigned int mm_lock_seq,
 {
        int locked;
 
-       /*
-        * __vma_enter_locked() returns false immediately if the vma is not
-        * attached, otherwise it waits until refcnt is indicating that vma
-        * is attached with no readers.
-        */
        locked = __vma_enter_locked(vma, false, state);
        if (locked < 0)
                return locked;