On Thu, Aug 18, 2022 at 12:53:39PM +0200, Martin Pieuchot wrote:
> Use a "slock" variable as done in multiple places to simplify the code.
> The locking stay the same. This is just a first step to simplify this
> mess.
>
> Also get rid of the return value of the function, it is never checked.
>
> ok?
ok jsg@
>
> Index: uvm/uvm_pdaemon.c
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_pdaemon.c,v
> retrieving revision 1.101
> diff -u -p -r1.101 uvm_pdaemon.c
> --- uvm/uvm_pdaemon.c 28 Jun 2022 19:31:30 -0000 1.101
> +++ uvm/uvm_pdaemon.c 18 Aug 2022 10:44:52 -0000
> @@ -102,7 +102,7 @@ extern void drmbackoff(long);
> */
>
> void uvmpd_scan(struct uvm_pmalloc *);
> -boolean_t uvmpd_scan_inactive(struct uvm_pmalloc *, struct pglist *);
> +void uvmpd_scan_inactive(struct uvm_pmalloc *, struct pglist *);
> void uvmpd_tune(void);
> void uvmpd_drop(struct pglist *);
>
> @@ -377,17 +377,16 @@ uvm_aiodone_daemon(void *arg)
> * => we handle the building of swap-backed clusters
> * => we return TRUE if we are exiting because we met our target
> */
> -
> -boolean_t
> +void
> uvmpd_scan_inactive(struct uvm_pmalloc *pma, struct pglist *pglst)
> {
> - boolean_t retval = FALSE; /* assume we haven't hit target */
> int free, result;
> struct vm_page *p, *nextpg;
> struct uvm_object *uobj;
> struct vm_page *pps[SWCLUSTPAGES], **ppsp;
> int npages;
> struct vm_page *swpps[SWCLUSTPAGES]; /* XXX: see below */
> + struct rwlock *slock;
> int swnpages, swcpages; /* XXX: see below */
> int swslot;
> struct vm_anon *anon;
> @@ -402,7 +401,6 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> */
> swslot = 0;
> swnpages = swcpages = 0;
> - free = 0;
> dirtyreacts = 0;
> p = NULL;
>
> @@ -431,18 +429,14 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> */
> uobj = NULL;
> anon = NULL;
> -
> if (p) {
> /*
> - * update our copy of "free" and see if we've met
> - * our target
> + * see if we've met our target
> */
> free = uvmexp.free - BUFPAGES_DEFICIT;
> if (((pma == NULL || (pma->pm_flags & UVM_PMA_FREED)) &&
> (free + uvmexp.paging >= uvmexp.freetarg << 2)) ||
> dirtyreacts == UVMPD_NUMDIRTYREACTS) {
> - retval = TRUE;
> -
> if (swslot == 0) {
> /* exit now if no swap-i/o pending */
> break;
> @@ -450,9 +444,9 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
>
> /* set p to null to signal final swap i/o */
> p = NULL;
> + nextpg = NULL;
> }
> }
> -
> if (p) { /* if (we have a new page to consider) */
> /*
> * we are below target and have a new page to consider.
> @@ -460,11 +454,12 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> uvmexp.pdscans++;
> nextpg = TAILQ_NEXT(p, pageq);
>
> + anon = p->uanon;
> + uobj = p->uobject;
> if (p->pg_flags & PQ_ANON) {
> - anon = p->uanon;
> KASSERT(anon != NULL);
> - if (rw_enter(anon->an_lock,
> - RW_WRITE|RW_NOSLEEP)) {
> + slock = anon->an_lock;
> + if (rw_enter(slock, RW_WRITE|RW_NOSLEEP)) {
> /* lock failed, skip this page */
> continue;
> }
> @@ -474,23 +469,20 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> */
> if (pmap_is_referenced(p)) {
> uvm_pageactivate(p);
> - rw_exit(anon->an_lock);
> + rw_exit(slock);
> uvmexp.pdreact++;
> continue;
> }
> if (p->pg_flags & PG_BUSY) {
> - rw_exit(anon->an_lock);
> + rw_exit(slock);
> uvmexp.pdbusy++;
> - /* someone else owns page, skip it */
> continue;
> }
> uvmexp.pdanscan++;
> } else {
> - uobj = p->uobject;
> KASSERT(uobj != NULL);
> - if (rw_enter(uobj->vmobjlock,
> - RW_WRITE|RW_NOSLEEP)) {
> - /* lock failed, skip this page */
> + slock = uobj->vmobjlock;
> + if (rw_enter(slock, RW_WRITE|RW_NOSLEEP)) {
> continue;
> }
> /*
> @@ -499,14 +491,13 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> */
> if (pmap_is_referenced(p)) {
> uvm_pageactivate(p);
> - rw_exit(uobj->vmobjlock);
> + rw_exit(slock);
> uvmexp.pdreact++;
> continue;
> }
> if (p->pg_flags & PG_BUSY) {
> - rw_exit(uobj->vmobjlock);
> + rw_exit(slock);
> uvmexp.pdbusy++;
> - /* someone else owns page, skip it */
> continue;
> }
> uvmexp.pdobscan++;
> @@ -539,10 +530,8 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
>
> /* remove from object */
> anon->an_page = NULL;
> - rw_exit(anon->an_lock);
> - } else {
> - rw_exit(uobj->vmobjlock);
> }
> + rw_exit(slock);
> continue;
> }
>
> @@ -552,11 +541,7 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> */
> if ((pma == NULL || (pma->pm_flags & UVM_PMA_FREED)) &&
> (free + uvmexp.paging > uvmexp.freetarg << 2)) {
> - if (anon) {
> - rw_exit(anon->an_lock);
> - } else {
> - rw_exit(uobj->vmobjlock);
> - }
> + rw_exit(slock);
> continue;
> }
>
> @@ -569,11 +554,7 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> if ((p->pg_flags & PQ_SWAPBACKED) && uvm_swapisfull()) {
> dirtyreacts++;
> uvm_pageactivate(p);
> - if (anon) {
> - rw_exit(anon->an_lock);
> - } else {
> - rw_exit(uobj->vmobjlock);
> - }
> + rw_exit(slock);
> continue;
> }
>
> @@ -640,11 +621,7 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> &p->pg_flags,
> PG_BUSY);
> UVM_PAGE_OWN(p, NULL);
> - if (anon)
> - rw_exit(anon->an_lock);
> - else
> - rw_exit(
> - uobj->vmobjlock);
> + rw_exit(slock);
> continue;
> }
> swcpages = 0; /* cluster is empty */
> @@ -676,10 +653,7 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> */
> if (swap_backed) {
> if (p) { /* if we just added a page to cluster */
> - if (anon)
> - rw_exit(anon->an_lock);
> - else
> - rw_exit(uobj->vmobjlock);
> + rw_exit(slock);
>
> /* cluster not full yet? */
> if (swcpages < swnpages)
> @@ -791,10 +765,7 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
>
> /* !swap_backed case: already locked... */
> if (swap_backed) {
> - if (anon)
> - rw_enter(anon->an_lock, RW_WRITE);
> - else
> - rw_enter(uobj->vmobjlock, RW_WRITE);
> + rw_enter(slock, RW_WRITE);
> }
>
> #ifdef DIAGNOSTIC
> @@ -855,10 +826,7 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> * the inactive queue can't be re-queued [note: not
> * true for active queue]).
> */
> - if (anon)
> - rw_exit(anon->an_lock);
> - else if (uobj)
> - rw_exit(uobj->vmobjlock);
> + rw_exit(slock);
>
> if (nextpg && (nextpg->pg_flags & PQ_INACTIVE) == 0) {
> nextpg = TAILQ_FIRST(pglst); /* reload! */
> @@ -877,7 +845,6 @@ uvmpd_scan_inactive(struct uvm_pmalloc *
> uvm_lock_pageq();
> }
> }
> - return (retval);
> }
>
> /*
> @@ -925,10 +892,6 @@ uvmpd_scan(struct uvm_pmalloc *pma)
> * to inactive ones.
> */
>
> - /*
> - * alternate starting queue between swap and object based on the
> - * low bit of uvmexp.pdrevs (which we bump by one each call).
> - */
> pages_freed = uvmexp.pdfreed;
> (void) uvmpd_scan_inactive(pma, &uvm.page_inactive);
> pages_freed = uvmexp.pdfreed - pages_freed;
>
>