sys/uvm: avoid waiting with the object lock held in uvn_get()

Kirill A. Korinsky <[email protected]>
Newsgroups gmane.os.openbsd.tech
Message-ID <[email protected]>
tech@,

uvm_wait() requires all locks to be released, but uvn_get() calls it with
uobj->vmobjlock held when uvm_pagealloc() fails. The page daemon may need
this lock to reclaim the object's pages; waiting for free memory while
retaining it can ends with deadlock.

Dropping and reacquiring the lock around uvm_wait() is not safe either: the
fault maps are already unlocked, so the mapping and vnode object state may
change while the thread sleeps.

So, eelease vmobjlock and return VM_PAGER_AGAIN instead; the fault handler
backs off, restarts the fault, and revalidates its state before retrying
again.

Ok?

Index: sys/uvm/uvm_vnode.c
===================================================================
RCS file: /home/cvs/src/sys/uvm/uvm_vnode.c,v
diff -u -p -r1.151 uvm_vnode.c
--- sys/uvm/uvm_vnode.c	29 Dec 2025 16:07:14 -0000	1.151
+++ sys/uvm/uvm_vnode.c	8 Aug 2026 17:52:53 -0000
@@ -1029,10 +1029,8 @@ uvn_get(struct uvm_object *uobj, voff_t 
 
 				/* out of RAM? */
 				if (ptmp == NULL) {
-					uvm_wait("uvn_getpage");
-
-					/* goto top of pps while loop */
-					continue;
+					rw_exit(uobj->vmobjlock);
+					return VM_PAGER_AGAIN;
 				}
 
 				/*

-- 
wbr, Kirill
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.