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;

Reply via email to