Index | Thread | Search

From:
Mark Kettenis <mark.kettenis@xs4all.nl>
Subject:
Re: uvm_pmr_cache_drain(): return number of freed pages
To:
Martin Pieuchot <mpi@grenadille.net>
Cc:
tech@openbsd.org
Date:
Mon, 30 Sep 2024 11:57:07 +0200

Download raw body.

Thread
> Date: Mon, 30 Sep 2024 10:14:50 +0200
> From: Martin Pieuchot <mpi@grenadille.net>
> 
> To reduce accesses to the global `uvmexp.free', I'd like know how many
> pages have been freed by every "shrinker".  In this case change 
> uvm_pmr_cache_drain() such that it returns the number of freed pages.
> 
> ok?

ok kettenis@

> Index: uvm/uvm_pmemrange.c
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_pmemrange.c,v
> diff -u -p -r1.67 uvm_pmemrange.c
> --- uvm/uvm_pmemrange.c	18 Aug 2024 08:18:49 -0000	1.67
> +++ uvm/uvm_pmemrange.c	30 Sep 2024 08:11:15 -0000
> @@ -2279,7 +2279,7 @@ uvm_pmr_cache_get(int flags)
>  	return pg;
>  }
>  
> -void
> +unsigned int
>  uvm_pmr_cache_free(struct uvm_pmr_cache_item *upci)
>  {
>  	struct pglist pgl;
> @@ -2296,6 +2296,8 @@ uvm_pmr_cache_free(struct uvm_pmr_cache_
>  	atomic_sub_int(&uvmexp.percpucaches, upci->upci_npages);
>  	upci->upci_npages = 0;
>  	memset(upci->upci_pages, 0, sizeof(upci->upci_pages));
> +
> +	return i;
>  }
>  
>  void
> @@ -2337,16 +2339,19 @@ uvm_pmr_cache_put(struct vm_page *pg)
>  	splx(s);
>  }
>  
> -void
> +unsigned int
>  uvm_pmr_cache_drain(void)
>  {
>  	struct uvm_pmr_cache *upc = &curcpu()->ci_uvm;
> +	unsigned int freed = 0;
>  	int s;
>  
>  	s = splvm();
> -	uvm_pmr_cache_free(&upc->upc_magz[0]);
> -	uvm_pmr_cache_free(&upc->upc_magz[1]);
> +	freed += uvm_pmr_cache_free(&upc->upc_magz[0]);
> +	freed += uvm_pmr_cache_free(&upc->upc_magz[1]);
>  	splx(s);
> +
> +	return freed;
>  }
>  
>  #else /* !(MULTIPROCESSOR && __HAVE_UVM_PERCPU) */
> @@ -2363,8 +2368,9 @@ uvm_pmr_cache_put(struct vm_page *pg)
>  	uvm_pmr_freepages(pg, 1);
>  }
>  
> -void
> +unsigned int
>  uvm_pmr_cache_drain(void)
>  {
> +	return 0;
>  }
>  #endif
> Index: uvm/uvm_pmemrange.h
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_pmemrange.h,v
> diff -u -p -r1.17 uvm_pmemrange.h
> --- uvm/uvm_pmemrange.h	1 May 2024 12:54:27 -0000	1.17
> +++ uvm/uvm_pmemrange.h	30 Sep 2024 08:11:15 -0000
> @@ -149,7 +149,7 @@ struct vm_page		*uvm_pmr_extract_range(s
>  			    struct pglist *);
>  struct vm_page		*uvm_pmr_cache_get(int);
>  void			 uvm_pmr_cache_put(struct vm_page *);
> -void			 uvm_pmr_cache_drain(void);
> +unsigned int		 uvm_pmr_cache_drain(void);
>  
>  
>  #endif /* _UVM_UVM_PMEMRANGE_H_ */
> 
>