Index | Thread | Search

From:
Martin Pieuchot <mpi@grenadille.net>
Subject:
Re: pdaemon: inactive shortage
To:
tech@openbsd.org
Date:
Fri, 1 Nov 2024 13:22:06 +0100

Download raw body.

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