Update uvmexp.swpgonly only once in uvm_swap_get().
authormpi <mpi@openbsd.org>
Thu, 28 Apr 2022 09:58:11 +0000 (09:58 +0000)
committermpi <mpi@openbsd.org>
Thu, 28 Apr 2022 09:58:11 +0000 (09:58 +0000)
Prevent a small window where a check could be incorrect in case an error
occurs in uvm_swap_io().

ok kettenis@, kn@

sys/uvm/uvm_swap.c

index bee6ac9..d49969c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uvm_swap.c,v 1.154 2022/03/17 10:15:13 mpi Exp $      */
+/*     $OpenBSD: uvm_swap.c,v 1.155 2022/04/28 09:58:11 mpi Exp $      */
 /*     $NetBSD: uvm_swap.c,v 1.40 2000/11/17 11:39:39 mrg Exp $        */
 
 /*
@@ -1572,17 +1572,16 @@ uvm_swap_get(struct vm_page *page, int swslot, int flags)
        }
 
        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);
 }