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

Mark Kettenis <[email protected]>
Newsgroups gmane.os.openbsd.tech
Message-ID <[email protected]>
> Date: Sat, 08 Aug 2026 20:05:30 +0200
> From: Kirill A. Korinsky <[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?

The problem with that strategy is that it may result in us faulting in
a tight loop, preventing the system from making much progress.

Maybe it is better to release the lock, call uvm_wait(), and then
return VM_PAGER_AGAIN?


> 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.