Index | Thread | Search

From:
Martin Pieuchot <mpi@grenadille.net>
Subject:
Honor WAITOK flag
To:
tech@openbsd.org
Date:
Sun, 9 Nov 2025 10:20:02 +0000

Download raw body.

Thread
  • Martin Pieuchot:

    Honor WAITOK flag

uvm_pagermapin() is called with the WAITOK flag during page faults in
uvn_io().  There, it is expected to block if necessary and return a
valid kva.

bluhm@ reported in august a bug where this didn't happen:
  https://marc.info/?l=openbsd-bugs&m=175648751931652&w=2

Diff below fixes the issue by waking the pdaemon and sleeping for memory
if pmap_enter(9) fails.

Note that the pdaemon doesn't pass the WAITOK flag when it calls this
function.

ok?

Index: uvm/uvm_pager.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_pager.c,v
diff -u -p -r1.94 uvm_pager.c
--- uvm/uvm_pager.c	10 Mar 2025 14:13:58 -0000	1.94
+++ uvm/uvm_pager.c	6 Oct 2025 08:13:07 -0000
@@ -263,13 +263,16 @@ uvm_pagermapin(struct vm_page **pps, int
 		pp = *pps++;
 		KASSERT(pp);
 		KASSERT(pp->pg_flags & PG_BUSY);
-		/* Allow pmap_enter to fail. */
-		if (pmap_enter(pmap_kernel(), cva, VM_PAGE_TO_PHYS(pp),
+		while (pmap_enter(pmap_kernel(), cva, VM_PAGE_TO_PHYS(pp),
 		    prot, PMAP_WIRED | PMAP_CANFAIL | prot) != 0) {
-			pmap_remove(pmap_kernel(), kva, cva);
-			pmap_update(pmap_kernel());
-			uvm_pseg_release(kva);
-			return 0;
+		    	if (flags & UVMPAGER_MAPIN_WAITOK)
+		    		uvm_wait("pgrmapin");
+			else {
+				pmap_remove(pmap_kernel(), kva, cva);
+				pmap_update(pmap_kernel());
+				uvm_pseg_release(kva);
+				return 0;
+			}
 		}
 	}
 	pmap_update(pmap_kernel());