Try to allocate the buffer before doing the encryption, if it fails we
do not spend time doing the encryption.  This reduce the pressure when
swapping with low memory.

ok?

Index: uvm/uvm_swap.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_swap.c,v
retrieving revision 1.153
diff -u -p -r1.153 uvm_swap.c
--- uvm/uvm_swap.c      22 Feb 2022 01:15:02 -0000      1.153
+++ uvm/uvm_swap.c      12 Mar 2022 10:30:26 -0000
@@ -1690,6 +1690,26 @@ uvm_swap_io(struct vm_page **pps, int st
                }
        }
 
+       /*
+        * now allocate a buf for the i/o.
+        * [make sure we don't put the pagedaemon to sleep...]
+        */
+       pflag = (async || curproc == uvm.pagedaemon_proc) ? PR_NOWAIT :
+           PR_WAITOK;
+       bp = pool_get(&bufpool, pflag | PR_ZERO);
+
+       /*
+        * if we failed to get a swapbuf, return "try again"
+        */
+       if (bp == NULL) {
+               if (bounce) {
+                       uvm_pagermapout(bouncekva, npages);
+                       uvm_swap_freepages(tpps, npages);
+               }
+               uvm_pagermapout(kva, npages);
+               return (VM_PAGER_AGAIN);
+       }
+
        /* encrypt to swap */
        if (write && bounce) {
                int i, opages;
@@ -1729,35 +1749,6 @@ uvm_swap_io(struct vm_page **pps, int st
                                      PGO_PDFREECLUST);
 
                kva = bouncekva;
-       }
-
-       /*
-        * now allocate a buf for the i/o.
-        * [make sure we don't put the pagedaemon to sleep...]
-        */
-       pflag = (async || curproc == uvm.pagedaemon_proc) ? PR_NOWAIT :
-           PR_WAITOK;
-       bp = pool_get(&bufpool, pflag | PR_ZERO);
-
-       /*
-        * if we failed to get a swapbuf, return "try again"
-        */
-       if (bp == NULL) {
-               if (write && bounce) {
-#ifdef UVM_SWAP_ENCRYPT
-                       int i;
-
-                       /* swap encrypt needs cleanup */
-                       if (encrypt)
-                               for (i = 0; i < npages; i++)
-                                       SWAP_KEY_PUT(sdp, SWD_KEY(sdp,
-                                           startslot + i));
-#endif
-
-                       uvm_pagermapout(kva, npages);
-                       uvm_swap_freepages(tpps, npages);
-               }
-               return (VM_PAGER_AGAIN);
        }
 
        /*

Reply via email to