From: Martin Pieuchot Subject: uvm_pmr_cache_drain(): return number of freed pages To: tech@openbsd.org Date: Mon, 30 Sep 2024 10:14:50 +0200 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? 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_ */