uvm_swap_io() needs to perform up to 4 allocations to write pages to
disk. In OOM situation uvm_swap_allocpages() always fail because the
kernel doesn't reserve enough pages.
Diff below set `uvmexp.reserve_pagedaemon' to the number of pages needed
to write a cluster of pages to disk. With this my machine do not
deadlock and can push pages to swap in OOM case.
ok?
Index: uvm/uvm_page.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_page.c,v
retrieving revision 1.166
diff -u -p -r1.166 uvm_page.c
--- uvm/uvm_page.c 12 May 2022 12:48:36 -0000 1.166
+++ uvm/uvm_page.c 26 Jun 2022 08:17:34 -0000
@@ -280,10 +280,13 @@ uvm_page_init(vaddr_t *kvm_startp, vaddr
/*
* init reserve thresholds
- * XXXCDC - values may need adjusting
+ *
+ * The pagedaemon needs to always be able to write pages to disk,
+ * Reserve the minimum amount of pages, a cluster, required by
+ * uvm_swap_allocpages()
*/
- uvmexp.reserve_pagedaemon = 4;
- uvmexp.reserve_kernel = 8;
+ uvmexp.reserve_pagedaemon = (MAXBSIZE >> PAGE_SHIFT);
+ uvmexp.reserve_kernel = uvmexp.reserve_pagedaemon + 4;
uvmexp.anonminpct = 10;
uvmexp.vnodeminpct = 10;
uvmexp.vtextminpct = 5;