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);
}