Index | Thread | Search

From:
Mark Kettenis <mark.kettenis@xs4all.nl>
Subject:
Re: Use uvmpd_dropswap()
To:
Martin Pieuchot <mpi@openbsd.org>
Cc:
tech@openbsd.org
Date:
Sat, 06 Apr 2024 15:33:44 +0200

Download raw body.

Thread
  • Martin Pieuchot:

    Use uvmpd_dropswap()

    • Mark Kettenis:

      Use uvmpd_dropswap()

> Date: Sat, 6 Apr 2024 13:25:46 +0200
> From: Martin Pieuchot <mpi@openbsd.org>
> 
> Also use uvmpd_dropswap() in the case of swap shortage.  ok?

ok kettenis@

> Index: uvm/uvm_pdaemon.c
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_pdaemon.c,v
> diff -u -p -r1.110 uvm_pdaemon.c
> --- uvm/uvm_pdaemon.c	24 Mar 2024 10:29:35 -0000	1.110
> +++ uvm/uvm_pdaemon.c	6 Apr 2024 11:21:17 -0000
> @@ -107,7 +107,7 @@ void		uvmpd_scan_inactive(struct uvm_pma
>  		    struct uvm_constraint_range *, struct pglist *);
>  void		uvmpd_tune(void);
>  void		uvmpd_drop(struct pglist *);
> -void		uvmpd_dropswap(struct vm_page *);
> +int		uvmpd_dropswap(struct vm_page *);
>  
>  /*
>   * uvm_wait: wait (sleep) for the page daemon to free some pages
> @@ -382,23 +382,29 @@ uvmpd_trylockowner(struct vm_page *pg)
>  	return slock;
>  }
>  
> -
>  /*
>   * uvmpd_dropswap: free any swap allocated to this page.
>   *
>   * => called with owner locked.
> + * => return 1 if a page had an associated slot.
>   */
> -void
> +int
>  uvmpd_dropswap(struct vm_page *pg)
>  {
>  	struct vm_anon *anon = pg->uanon;
> +	int slot, result = 0;
>  
>  	if ((pg->pg_flags & PQ_ANON) && anon->an_swslot) {
>  		uvm_swap_free(anon->an_swslot, 1);
>  		anon->an_swslot = 0;
> +		result = 1;
>  	} else if (pg->pg_flags & PQ_AOBJ) {
> -		uao_dropswap(pg->uobject, pg->offset >> PAGE_SHIFT);
> +		slot = uao_dropswap(pg->uobject, pg->offset >> PAGE_SHIFT);
> +		if (slot)
> +			result = 1;
>  	}
> +
> +	return result;
>  }
>  
>  /*
> @@ -941,21 +947,9 @@ uvmpd_scan(struct uvm_pmalloc *pma, stru
>  		 * to this page so that other pages can be paged out.
>  		 */
>  		if (swap_shortage > 0) {
> -			if ((p->pg_flags & PQ_ANON) && p->uanon->an_swslot) {
> -				uvm_swap_free(p->uanon->an_swslot, 1);
> -				p->uanon->an_swslot = 0;
> +			if (uvmpd_dropswap(p)) {
>  				atomic_clearbits_int(&p->pg_flags, PG_CLEAN);
>  				swap_shortage--;
> -			}
> -			if (p->pg_flags & PQ_AOBJ) {
> -				int slot = uao_set_swslot(p->uobject,
> -					p->offset >> PAGE_SHIFT, 0);
> -				if (slot) {
> -					uvm_swap_free(slot, 1);
> -					atomic_clearbits_int(&p->pg_flags,
> -					    PG_CLEAN);
> -					swap_shortage--;
> -				}
>  			}
>  		}
>  
> 
>