From: Martin Pieuchot Subject: Re: pdaemon: inactive shortage To: tech@openbsd.org Date: Fri, 1 Nov 2024 13:22:06 +0100 On 20/10/24(Sun) 12:05, Martin Pieuchot wrote: > There are two possible conditions to require list scan. Either the > amount of free pages is below the high watermark or the lists are > unbalanced. I'd like to have a single computation that determines if > the lists are unbalanced. Diff below does that, ok? Anyone? This is the next piece to be able to read global counters only once per iteration in the page daemon. > Index: uvm/uvm_pdaemon.c > =================================================================== > RCS file: /cvs/src/sys/uvm/uvm_pdaemon.c,v > diff -u -p -r1.117 uvm_pdaemon.c > --- uvm/uvm_pdaemon.c 2 Oct 2024 10:36:33 -0000 1.117 > +++ uvm/uvm_pdaemon.c 20 Oct 2024 10:01:02 -0000 > @@ -102,7 +102,8 @@ extern unsigned long drmbackoff(long); > */ > > struct rwlock *uvmpd_trylockowner(struct vm_page *); > -void uvmpd_scan(struct uvm_pmalloc *, struct uvm_constraint_range *); > +void uvmpd_scan(struct uvm_pmalloc *, int, > + struct uvm_constraint_range *); > int uvmpd_scan_inactive(struct uvm_pmalloc *, > struct uvm_constraint_range *); > void uvmpd_tune(void); > @@ -205,7 +206,7 @@ uvm_pageout(void *arg) > { > struct uvm_constraint_range constraint; > struct uvm_pmalloc *pma; > - int free; > + int inactive_shortage, free; > > /* ensure correct priority and set paging parameters... */ > uvm.pagedaemon_proc = curproc; > @@ -269,9 +270,11 @@ uvm_pageout(void *arg) > */ > uvm_lock_pageq(); > free = uvmexp.free - BUFPAGES_DEFICIT; > + inactive_shortage = > + uvmexp.inactarg - uvmexp.inactive - BUFPAGES_INACT; > if (pma != NULL || (free < uvmexp.freetarg) || > - ((uvmexp.inactive + BUFPAGES_INACT) < uvmexp.inactarg)) { > - uvmpd_scan(pma, &constraint); > + (inactive_shortage > 0)) { > + uvmpd_scan(pma, inactive_shortage, &constraint); > } > > /* > @@ -858,9 +861,10 @@ uvmpd_scan_inactive(struct uvm_pmalloc * > */ > > void > -uvmpd_scan(struct uvm_pmalloc *pma, struct uvm_constraint_range *constraint) > +uvmpd_scan(struct uvm_pmalloc *pma, int inactive_shortage, > + struct uvm_constraint_range *constraint) > { > - int free, inactive_shortage, swap_shortage, pages_freed; > + int free, swap_shortage, pages_freed; > struct vm_page *p, *nextpg; > struct rwlock *slock; > paddr_t paddr; > @@ -899,10 +903,7 @@ uvmpd_scan(struct uvm_pmalloc *pma, stru > /* > * we have done the scan to get free pages. now we work on meeting > * our inactive target. > - */ > - inactive_shortage = uvmexp.inactarg - uvmexp.inactive - BUFPAGES_INACT; > - > - /* > + * > * detect if we're not going to be able to page anything out > * until we free some swap resources from active pages. > */ >