Introduce a new helper to check global variables that will need to be
protected from concurrent access.

The name is taken from NetBSD in order to reduce the difference between
our trees.

Diff below introduces a syntax change in uvmpd_scan() where the boolean
test "<" becomes "!=".  This shouldn't matter because `uvmexp.swpgonly'
must always be smaller than `uvmexp.swpages'.

Ok?

Index: uvm/uvm_fault.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_fault.c,v
retrieving revision 1.101
diff -u -p -r1.101 uvm_fault.c
--- uvm/uvm_fault.c     24 Sep 2020 09:51:07 -0000      1.101
+++ uvm/uvm_fault.c     25 Sep 2020 08:28:51 -0000
@@ -881,7 +881,6 @@ ReFault:
                /* check for out of RAM */
                if (anon == NULL || pg == NULL) {
                        uvmfault_unlockall(&ufi, amap, NULL, oanon);
-                       KASSERT(uvmexp.swpgonly <= uvmexp.swpages);
                        if (anon == NULL)
                                uvmexp.fltnoanon++;
                        else {
@@ -889,7 +888,7 @@ ReFault:
                                uvmexp.fltnoram++;
                        }
 
-                       if (uvmexp.swpgonly == uvmexp.swpages)
+                       if (uvm_swapisfull())
                                return (ENOMEM);
 
                        /* out of RAM, wait for more */
@@ -942,8 +941,7 @@ ReFault:
                 * as the map may change while we're asleep.
                 */
                uvmfault_unlockall(&ufi, amap, NULL, oanon);
-               KASSERT(uvmexp.swpgonly <= uvmexp.swpages);
-               if (uvmexp.swpgonly == uvmexp.swpages) {
+               if (uvm_swapisfull()) {
                        /* XXX instrumentation */
                        return (ENOMEM);
                }
@@ -1137,7 +1135,6 @@ Case2:
 
                        /* unlock and fail ... */
                        uvmfault_unlockall(&ufi, amap, uobj, NULL);
-                       KASSERT(uvmexp.swpgonly <= uvmexp.swpages);
                        if (anon == NULL)
                                uvmexp.fltnoanon++;
                        else {
@@ -1145,7 +1142,7 @@ Case2:
                                uvmexp.fltnoram++;
                        }
 
-                       if (uvmexp.swpgonly == uvmexp.swpages)
+                       if (uvm_swapisfull())
                                return (ENOMEM);
 
                        /* out of RAM, wait for more */
@@ -1191,11 +1188,10 @@ Case2:
                if (amap_add(&ufi.entry->aref,
                    ufi.orig_rvaddr - ufi.entry->start, anon, 0)) {
                        uvmfault_unlockall(&ufi, amap, NULL, oanon);
-                       KASSERT(uvmexp.swpgonly <= uvmexp.swpages);
                        uvm_anfree(anon);
                        uvmexp.fltnoamap++;
 
-                       if (uvmexp.swpgonly == uvmexp.swpages)
+                       if (uvm_swapisfull())
                                return (ENOMEM);
 
                        amap_populate(&ufi.entry->aref,
@@ -1225,8 +1221,7 @@ Case2:
                atomic_clearbits_int(&pg->pg_flags, PG_BUSY|PG_FAKE|PG_WANTED);
                UVM_PAGE_OWN(pg, NULL);
                uvmfault_unlockall(&ufi, amap, uobj, NULL);
-               KASSERT(uvmexp.swpgonly <= uvmexp.swpages);
-               if (uvmexp.swpgonly == uvmexp.swpages) {
+               if (uvm_swapisfull()) {
                        /* XXX instrumentation */
                        return (ENOMEM);
                }
Index: uvm/uvm_pdaemon.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_pdaemon.c,v
retrieving revision 1.86
diff -u -p -r1.86 uvm_pdaemon.c
--- uvm/uvm_pdaemon.c   4 Apr 2020 22:08:02 -0000       1.86
+++ uvm/uvm_pdaemon.c   25 Sep 2020 08:28:52 -0000
@@ -522,9 +522,7 @@ uvmpd_scan_inactive(struct pglist *pglst
                         * reactivate it so that we eventually cycle
                         * all pages thru the inactive queue.
                         */
-                       KASSERT(uvmexp.swpgonly <= uvmexp.swpages);
-                       if ((p->pg_flags & PQ_SWAPBACKED) &&
-                           uvmexp.swpgonly == uvmexp.swpages) {
+                       if ((p->pg_flags & PQ_SWAPBACKED) && uvm_swapisfull()) {
                                dirtyreacts++;
                                uvm_pageactivate(p);
                                continue;
@@ -879,7 +877,7 @@ uvmpd_scan(void)
        swap_shortage = 0;
        if (uvmexp.free < uvmexp.freetarg &&
            uvmexp.swpginuse == uvmexp.swpages &&
-           uvmexp.swpgonly < uvmexp.swpages &&
+           !uvm_swapisfull() &&
            pages_freed == 0) {
                swap_shortage = uvmexp.freetarg - uvmexp.free;
        }
Index: uvm/uvm_swap.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_swap.c,v
retrieving revision 1.146
diff -u -p -r1.146 uvm_swap.c
--- uvm/uvm_swap.c      20 Jan 2020 23:21:57 -0000      1.146
+++ uvm/uvm_swap.c      25 Sep 2020 08:28:52 -0000
@@ -1441,6 +1441,21 @@ ReTry:   /* XXXMRG */
 }
 
 /*
+ * uvm_swapisfull: return true if all of available swap is allocated
+ * and in use.
+ */
+int
+uvm_swapisfull(void)
+{
+       int result;
+
+       KASSERT(uvmexp.swpgonly <= uvmexp.swpages);
+       result = (uvmexp.swpgonly == uvmexp.swpages);
+
+       return result;
+}
+
+/*
  * uvm_swap_markbad: keep track of swap ranges where we've had i/o errors
  *
  * => we lock uvm.swap_data_lock
Index: uvm/uvm_swap.h
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_swap.h,v
retrieving revision 1.17
diff -u -p -r1.17 uvm_swap.h
--- uvm/uvm_swap.h      5 Dec 2019 12:46:54 -0000       1.17
+++ uvm/uvm_swap.h      25 Sep 2020 08:28:52 -0000
@@ -41,6 +41,7 @@ int                   uvm_swap_put(int, struct vm_page *
 int                    uvm_swap_alloc(int *, boolean_t);
 void                   uvm_swap_free(int, int);
 void                   uvm_swap_markbad(int, int);
+int                    uvm_swapisfull(void);
 void                   uvm_swap_freepages(struct vm_page **, int);
 #ifdef HIBERNATE
 int                    uvm_hibswap(dev_t, u_long *, u_long *);

Reply via email to