Index: sys/uvm/uvm_pdaemon.c =================================================================== RCS file: /cvsroot/src/sys/uvm/uvm_pdaemon.c,v retrieving revision 1.110 diff -p -u -r1.110 uvm_pdaemon.c --- sys/uvm/uvm_pdaemon.c 21 Apr 2019 15:32:18 -0000 1.110 +++ sys/uvm/uvm_pdaemon.c 25 Sep 2019 08:22:54 -0000 @@ -239,6 +239,7 @@ uvm_pageout(void *arg) { int npages = 0; int extrapages = 0; + int timo = 0; UVMHIST_FUNC("uvm_pageout"); UVMHIST_CALLED(pdhist); @@ -270,15 +271,19 @@ uvm_pageout(void *arg) bool needsscan, needsfree, kmem_va_starved; kmem_va_starved = uvm_km_va_starved_p(); + if (timo > 0 && kmem_va_starved) + printf("pagedaemon: Out of KVA, avaiting doom...\n"); mutex_spin_enter(&uvm_fpageqlock); - if ((uvm_pagedaemon_waiters == 0 || uvmexp.paging > 0) && - !kmem_va_starved) { + if (timo > 0 || + ((uvm_pagedaemon_waiters == 0 || uvmexp.paging > 0) && + !kmem_va_starved)) { UVMHIST_LOG(pdhist," <>",0,0,0,0); UVM_UNLOCK_AND_WAIT(&uvm.pagedaemon, - &uvm_fpageqlock, false, "pgdaemon", 0); + &uvm_fpageqlock, false, "pgdaemon", timo); uvmexp.pdwoke++; UVMHIST_LOG(pdhist," <>",0,0,0,0); + timo = 0; } else { mutex_spin_exit(&uvm_fpageqlock); } @@ -336,17 +341,16 @@ uvm_pageout(void *arg) mutex_exit(&uvm_pageqlock); /* - * if we don't need free memory, we're done. + * if we still need free memory, kick the poll drainer thread */ - if (!needsfree && !kmem_va_starved) - continue; + if (needsfree || kmem_va_starved) + uvmpd_pool_drain_wakeup(); /* - * kick the pool drainer thread. + * sleep before next run */ - - uvmpd_pool_drain_wakeup(); + timo = hz/2; } /*NOTREACHED*/ } .