From: Jeremie Courreges-Anglas Subject: Re: Honor WAITOK flag To: tech@openbsd.org Date: Wed, 12 Nov 2025 18:33:42 +0100 On Sun, Nov 09, 2025 at 10:20:02AM +0000, Martin Pieuchot wrote: > 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. I doubt I have really exercised this code path on these machines, but this went through a few bulk builds on arm64 and sparc64. Anyway, waiting here makes more sense than crashing. > ok? ok jca@ > 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()); > > -- jca