Commit faf3c923 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Andrew Morton
Browse files

mm: fix vma_start_write_killable() signal handling

If we get a signal, we need to restore the vm_refcnt.  We don't think that
the refcount can actually be decremented to zero here as it requires the
VMA to be detached, and the vma_mark_detached() uses TASK_UNINTERRUPTIBLE.
However, that's a bit subtle, so handle it as if the refcount was zero at
the start of this function.

Link: https://lkml.kernel.org/r/20251128040100.3022561-1-willy@infradead.org


Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>

Reported-by: default avatar <syzbot+5b19bad23ac7f44bf8b8@syzkaller.appspotmail.com>
Fixes: 2197bb60 ("mm: add vma_start_write_killable()")
Reviewed-by: default avatarSuren Baghdasaryan <surenb@google.com>
Reviewed-by: default avatarVlastimil Babka <vbabka@suse.cz>
Reviewed-by: default avatarLorenzo Stoakes <lorenzo.stoakes@oracle.com>
Reviewed-by: default avatarLiam R. Howlett <Liam.Howlett@oracle.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent b60a3ef7
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -74,6 +74,14 @@ static inline int __vma_enter_locked(struct vm_area_struct *vma,
		   refcount_read(&vma->vm_refcnt) == tgt_refcnt,
		   state);
	if (err) {
		if (refcount_sub_and_test(VMA_LOCK_OFFSET, &vma->vm_refcnt)) {
			/*
			 * The wait failed, but the last reader went away
			 * as well.  Tell the caller the VMA is detached.
			 */
			WARN_ON_ONCE(!detaching);
			err = 0;
		}
		rwsem_release(&vma->vmlock_dep_map, _RET_IP_);
		return err;
	}