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,"  <<SLEEPING>>",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,"  <<WOKE UP>>",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*/
 }
