Index | Thread | Search

From:
Jonathan Gray <jsg@jsg.id.au>
Subject:
Re: pdaemon: inactive shortage
To:
tech@openbsd.org
Date:
Fri, 1 Nov 2024 23:48:14 +1100

Download raw body.

Thread
On Fri, Nov 01, 2024 at 01:22:06PM +0100, Martin Pieuchot wrote:
> 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.

ok jsg@

> 
> > 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.
> >  	 */
> > 
> 
>