Small diff to decrement the counter only if the I/O succeed.  This
prevent a false positive if a check is performed before an error is
returned.

ok?

Index: uvm/uvm_swap.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_swap.c,v
retrieving revision 1.154
diff -u -p -r1.154 uvm_swap.c
--- uvm/uvm_swap.c      17 Mar 2022 10:15:13 -0000      1.154
+++ uvm/uvm_swap.c      26 Apr 2022 12:04:52 -0000
@@ -1572,17 +1572,16 @@ uvm_swap_get(struct vm_page *page, int s
        }
 
        KERNEL_LOCK();
-       /* this page is (about to be) no longer only in swap. */
-       atomic_dec_int(&uvmexp.swpgonly);
-
        result = uvm_swap_io(&page, swslot, 1, B_READ |
            ((flags & PGO_SYNCIO) ? 0 : B_ASYNC));
+       KERNEL_UNLOCK();
 
-       if (result != VM_PAGER_OK && result != VM_PAGER_PEND) {
-               /* oops, the read failed so it really is still only in swap. */
-               atomic_inc_int(&uvmexp.swpgonly);
+       if (result == VM_PAGER_OK || result == VM_PAGER_PEND) {
+               /*
+                * this page is no longer only in swap.
+                */
+               atomic_dec_int(&uvmexp.swpgonly);
        }
-       KERNEL_UNLOCK();
        return (result);
 }
 

Reply via email to