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