Diff below introduces a new wrapper to manipulate active/inactive page
queues. 

ok?

Index: uvm/uvm_page.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_page.c,v
retrieving revision 1.165
diff -u -p -r1.165 uvm_page.c
--- uvm/uvm_page.c      4 May 2022 14:58:26 -0000       1.165
+++ uvm/uvm_page.c      5 May 2022 12:49:13 -0000
@@ -987,16 +987,7 @@ uvm_pageclean(struct vm_page *pg)
        /*
         * now remove the page from the queues
         */
-       if (pg->pg_flags & PQ_ACTIVE) {
-               TAILQ_REMOVE(&uvm.page_active, pg, pageq);
-               flags_to_clear |= PQ_ACTIVE;
-               uvmexp.active--;
-       }
-       if (pg->pg_flags & PQ_INACTIVE) {
-               TAILQ_REMOVE(&uvm.page_inactive, pg, pageq);
-               flags_to_clear |= PQ_INACTIVE;
-               uvmexp.inactive--;
-       }
+       uvm_pagedequeue(pg);
 
        /*
         * if the page was wired, unwire it now.
@@ -1243,16 +1234,7 @@ uvm_pagewire(struct vm_page *pg)
        MUTEX_ASSERT_LOCKED(&uvm.pageqlock);
 
        if (pg->wire_count == 0) {
-               if (pg->pg_flags & PQ_ACTIVE) {
-                       TAILQ_REMOVE(&uvm.page_active, pg, pageq);
-                       atomic_clearbits_int(&pg->pg_flags, PQ_ACTIVE);
-                       uvmexp.active--;
-               }
-               if (pg->pg_flags & PQ_INACTIVE) {
-                       TAILQ_REMOVE(&uvm.page_inactive, pg, pageq);
-                       atomic_clearbits_int(&pg->pg_flags, PQ_INACTIVE);
-                       uvmexp.inactive--;
-               }
+               uvm_pagedequeue(pg);
                uvmexp.wired++;
        }
        pg->wire_count++;
@@ -1324,28 +1306,32 @@ uvm_pageactivate(struct vm_page *pg)
        KASSERT(uvm_page_owner_locked_p(pg));
        MUTEX_ASSERT_LOCKED(&uvm.pageqlock);
 
+       uvm_pagedequeue(pg);
+       if (pg->wire_count == 0) {
+               TAILQ_INSERT_TAIL(&uvm.page_active, pg, pageq);
+               atomic_setbits_int(&pg->pg_flags, PQ_ACTIVE);
+               uvmexp.active++;
+
+       }
+}
+
+/*
+ * uvm_pagedequeue: remove a page from any paging queue
+ */
+void
+uvm_pagedequeue(struct vm_page *pg)
+{
+       if (pg->pg_flags & PQ_ACTIVE) {
+               TAILQ_REMOVE(&uvm.page_active, pg, pageq);
+               atomic_clearbits_int(&pg->pg_flags, PQ_ACTIVE);
+               uvmexp.active--;
+       }
        if (pg->pg_flags & PQ_INACTIVE) {
                TAILQ_REMOVE(&uvm.page_inactive, pg, pageq);
                atomic_clearbits_int(&pg->pg_flags, PQ_INACTIVE);
                uvmexp.inactive--;
        }
-       if (pg->wire_count == 0) {
-               /*
-                * if page is already active, remove it from list so we
-                * can put it at tail.  if it wasn't active, then mark
-                * it active and bump active count
-                */
-               if (pg->pg_flags & PQ_ACTIVE)
-                       TAILQ_REMOVE(&uvm.page_active, pg, pageq);
-               else {
-                       atomic_setbits_int(&pg->pg_flags, PQ_ACTIVE);
-                       uvmexp.active++;
-               }
-
-               TAILQ_INSERT_TAIL(&uvm.page_active, pg, pageq);
-       }
 }
-
 /*
  * uvm_pagezero: zero fill a page
  */
Index: uvm/uvm_page.h
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_page.h,v
retrieving revision 1.67
diff -u -p -r1.67 uvm_page.h
--- uvm/uvm_page.h      29 Jan 2022 06:25:33 -0000      1.67
+++ uvm/uvm_page.h      5 May 2022 12:49:13 -0000
@@ -224,6 +224,7 @@ boolean_t   uvm_page_physget(paddr_t *);
 #endif
 
 void           uvm_pageactivate(struct vm_page *);
+void           uvm_pagedequeue(struct vm_page *);
 vaddr_t                uvm_pageboot_alloc(vsize_t);
 void           uvm_pagecopy(struct vm_page *, struct vm_page *);
 void           uvm_pagedeactivate(struct vm_page *);

Reply via email to