> Date: Mon, 2 May 2022 18:39:17 +0200
> From: Martin Pieuchot <[email protected]>
>
> Let's simplify the existing logic and use a single list for inactive
> pages. uvmpd_scan_inactive() already does a lot of check if it finds
> a page which is swap-backed. This will be improved in a next change.
So NetBSD did this in 2001. The commit message doesn't say why
though. The simplification is nice and the diff does what it says.
> ok?
ok kettenis@
> Index: uvm/uvm.h
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm.h,v
> retrieving revision 1.68
> diff -u -p -r1.68 uvm.h
> --- uvm/uvm.h 24 Nov 2020 13:49:09 -0000 1.68
> +++ uvm/uvm.h 2 May 2022 16:32:16 -0000
> @@ -53,8 +53,7 @@ struct uvm {
>
> /* vm_page queues */
> struct pglist page_active; /* [Q] allocated pages, in use */
> - struct pglist page_inactive_swp;/* [Q] pages inactive (reclaim/free) */
> - struct pglist page_inactive_obj;/* [Q] pages inactive (reclaim/free) */
> + struct pglist page_inactive; /* [Q] pages inactive (reclaim/free) */
> /* Lock order: pageqlock, then fpageqlock. */
> struct mutex pageqlock; /* [] lock for active/inactive page q */
> struct mutex fpageqlock; /* [] lock for free page q + pdaemon */
> Index: uvm/uvm_map.c
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_map.c,v
> retrieving revision 1.290
> diff -u -p -r1.290 uvm_map.c
> --- uvm/uvm_map.c 12 Mar 2022 08:11:07 -0000 1.290
> +++ uvm/uvm_map.c 2 May 2022 16:32:16 -0000
> @@ -3281,8 +3281,7 @@ uvm_page_printit(struct vm_page *pg, boo
> (*pr)(" >>> page not found in uvm_pmemrange <<<\n");
> pgl = NULL;
> } else if (pg->pg_flags & PQ_INACTIVE) {
> - pgl = (pg->pg_flags & PQ_SWAPBACKED) ?
> - &uvm.page_inactive_swp : &uvm.page_inactive_obj;
> + pgl = &uvm.page_inactive;
> } else if (pg->pg_flags & PQ_ACTIVE) {
> pgl = &uvm.page_active;
> } else {
> Index: uvm/uvm_page.c
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_page.c,v
> retrieving revision 1.164
> diff -u -p -r1.164 uvm_page.c
> --- uvm/uvm_page.c 28 Apr 2022 09:59:28 -0000 1.164
> +++ uvm/uvm_page.c 2 May 2022 16:32:16 -0000
> @@ -185,8 +185,7 @@ uvm_page_init(vaddr_t *kvm_startp, vaddr
> */
>
> TAILQ_INIT(&uvm.page_active);
> - TAILQ_INIT(&uvm.page_inactive_swp);
> - TAILQ_INIT(&uvm.page_inactive_obj);
> + TAILQ_INIT(&uvm.page_inactive);
> mtx_init(&uvm.pageqlock, IPL_VM);
> mtx_init(&uvm.fpageqlock, IPL_VM);
> uvm_pmr_init();
> @@ -994,10 +993,7 @@ uvm_pageclean(struct vm_page *pg)
> uvmexp.active--;
> }
> if (pg->pg_flags & PQ_INACTIVE) {
> - if (pg->pg_flags & PQ_SWAPBACKED)
> - TAILQ_REMOVE(&uvm.page_inactive_swp, pg, pageq);
> - else
> - TAILQ_REMOVE(&uvm.page_inactive_obj, pg, pageq);
> + TAILQ_REMOVE(&uvm.page_inactive, pg, pageq);
> flags_to_clear |= PQ_INACTIVE;
> uvmexp.inactive--;
> }
> @@ -1253,10 +1249,7 @@ uvm_pagewire(struct vm_page *pg)
> uvmexp.active--;
> }
> if (pg->pg_flags & PQ_INACTIVE) {
> - if (pg->pg_flags & PQ_SWAPBACKED)
> - TAILQ_REMOVE(&uvm.page_inactive_swp, pg, pageq);
> - else
> - TAILQ_REMOVE(&uvm.page_inactive_obj, pg, pageq);
> + TAILQ_REMOVE(&uvm.page_inactive, pg, pageq);
> atomic_clearbits_int(&pg->pg_flags, PQ_INACTIVE);
> uvmexp.inactive--;
> }
> @@ -1304,10 +1297,7 @@ uvm_pagedeactivate(struct vm_page *pg)
> }
> if ((pg->pg_flags & PQ_INACTIVE) == 0) {
> KASSERT(pg->wire_count == 0);
> - if (pg->pg_flags & PQ_SWAPBACKED)
> - TAILQ_INSERT_TAIL(&uvm.page_inactive_swp, pg, pageq);
> - else
> - TAILQ_INSERT_TAIL(&uvm.page_inactive_obj, pg, pageq);
> + TAILQ_INSERT_TAIL(&uvm.page_inactive, pg, pageq);
> atomic_setbits_int(&pg->pg_flags, PQ_INACTIVE);
> uvmexp.inactive++;
> pmap_clear_reference(pg);
> @@ -1335,10 +1325,7 @@ uvm_pageactivate(struct vm_page *pg)
> MUTEX_ASSERT_LOCKED(&uvm.pageqlock);
>
> if (pg->pg_flags & PQ_INACTIVE) {
> - if (pg->pg_flags & PQ_SWAPBACKED)
> - TAILQ_REMOVE(&uvm.page_inactive_swp, pg, pageq);
> - else
> - TAILQ_REMOVE(&uvm.page_inactive_obj, pg, pageq);
> + TAILQ_REMOVE(&uvm.page_inactive, pg, pageq);
> atomic_clearbits_int(&pg->pg_flags, PQ_INACTIVE);
> uvmexp.inactive--;
> }
> Index: uvm/uvm_pdaemon.c
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_pdaemon.c,v
> retrieving revision 1.97
> diff -u -p -r1.97 uvm_pdaemon.c
> --- uvm/uvm_pdaemon.c 30 Apr 2022 17:58:43 -0000 1.97
> +++ uvm/uvm_pdaemon.c 2 May 2022 16:32:16 -0000
> @@ -396,13 +396,6 @@ uvmpd_scan_inactive(struct pglist *pglst
> int dirtyreacts;
>
> /*
> - * note: we currently keep swap-backed pages on a separate inactive
> - * list from object-backed pages. however, merging the two lists
> - * back together again hasn't been ruled out. thus, we keep our
> - * swap cluster in "swpps" rather than in pps (allows us to mix
> - * clustering types in the event of a mixed inactive queue).
> - */
> - /*
> * swslot is non-zero if we are building a swap cluster. we want
> * to stay in the loop while we have a page to scan or we have
> * a swap-cluster to build.
> @@ -881,7 +874,6 @@ uvmpd_scan(void)
> struct uvm_object *uobj;
> struct vm_anon *anon;
> struct rwlock *slock;
> - boolean_t got_it;
>
> MUTEX_ASSERT_LOCKED(&uvm.pageqlock);
>
> @@ -917,14 +909,8 @@ uvmpd_scan(void)
> * alternate starting queue between swap and object based on the
> * low bit of uvmexp.pdrevs (which we bump by one each call).
> */
> - got_it = FALSE;
> - pages_freed = uvmexp.pdfreed; /* XXX - int */
> - if ((uvmexp.pdrevs & 1) != 0 && uvmexp.nswapdev != 0)
> - got_it = uvmpd_scan_inactive(&uvm.page_inactive_swp);
> - if (!got_it)
> - got_it = uvmpd_scan_inactive(&uvm.page_inactive_obj);
> - if (!got_it && (uvmexp.pdrevs & 1) == 0 && uvmexp.nswapdev != 0)
> - (void) uvmpd_scan_inactive(&uvm.page_inactive_swp);
> + pages_freed = uvmexp.pdfreed;
> + (void) uvmpd_scan_inactive(&uvm.page_inactive);
> pages_freed = uvmexp.pdfreed - pages_freed;
>
> /*
> @@ -1069,8 +1055,7 @@ uvmpd_drop(struct pglist *pglst)
> void
> uvmpd_hibernate(void)
> {
> - uvmpd_drop(&uvm.page_inactive_swp);
> - uvmpd_drop(&uvm.page_inactive_obj);
> + uvmpd_drop(&uvm.page_inactive);
> uvmpd_drop(&uvm.page_active);
> }
>
>
>