xref: /netbsd-src/sys/uvm/uvm_meter.c (revision 748d5a7e4723c3e76ae899beff05dbf6758b3391)
1*748d5a7eSad /*	$NetBSD: uvm_meter.c,v 1.80 2020/06/14 21:41:42 ad Exp $	*/
2f2caacc7Smrg 
3f2caacc7Smrg /*
4f2caacc7Smrg  * Copyright (c) 1997 Charles D. Cranor and Washington University.
5f2caacc7Smrg  * Copyright (c) 1982, 1986, 1989, 1993
6f2caacc7Smrg  *      The Regents of the University of California.
7f2caacc7Smrg  *
8f2caacc7Smrg  * All rights reserved.
9f2caacc7Smrg  *
10f2caacc7Smrg  * Redistribution and use in source and binary forms, with or without
11f2caacc7Smrg  * modification, are permitted provided that the following conditions
12f2caacc7Smrg  * are met:
13f2caacc7Smrg  * 1. Redistributions of source code must retain the above copyright
14f2caacc7Smrg  *    notice, this list of conditions and the following disclaimer.
15f2caacc7Smrg  * 2. Redistributions in binary form must reproduce the above copyright
16f2caacc7Smrg  *    notice, this list of conditions and the following disclaimer in the
17f2caacc7Smrg  *    documentation and/or other materials provided with the distribution.
1840ec801aSchuck  * 3. Neither the name of the University nor the names of its contributors
19f2caacc7Smrg  *    may be used to endorse or promote products derived from this software
20f2caacc7Smrg  *    without specific prior written permission.
21f2caacc7Smrg  *
22f2caacc7Smrg  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23f2caacc7Smrg  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24f2caacc7Smrg  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25f2caacc7Smrg  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26f2caacc7Smrg  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27f2caacc7Smrg  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28f2caacc7Smrg  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29f2caacc7Smrg  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30f2caacc7Smrg  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31f2caacc7Smrg  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32f2caacc7Smrg  * SUCH DAMAGE.
33f2caacc7Smrg  *
34f2caacc7Smrg  *      @(#)vm_meter.c  8.4 (Berkeley) 1/4/94
351f6b921cSmrg  * from: Id: uvm_meter.c,v 1.1.2.1 1997/08/14 19:10:35 chuck Exp
36f2caacc7Smrg  */
37f2caacc7Smrg 
38b616d1caSlukem #include <sys/cdefs.h>
39*748d5a7eSad __KERNEL_RCSID(0, "$NetBSD: uvm_meter.c,v 1.80 2020/06/14 21:41:42 ad Exp $");
40b616d1caSlukem 
41f2caacc7Smrg #include <sys/param.h>
42f2caacc7Smrg #include <sys/systm.h>
436a66466fSmatt #include <sys/cpu.h>
446a66466fSmatt #include <sys/proc.h>
45f2caacc7Smrg #include <sys/kernel.h>
46f2caacc7Smrg #include <sys/sysctl.h>
47f2caacc7Smrg 
488e3c57e6Suebayasi #include <uvm/uvm.h>
499d3e3eabSyamt #include <uvm/uvm_pdpolicy.h>
509d3e3eabSyamt 
51f2caacc7Smrg /*
52f2caacc7Smrg  * maxslp: ???? XXXCDC
53f2caacc7Smrg  */
54f2caacc7Smrg 
55f2caacc7Smrg int maxslp = MAXSLP;	/* patchable ... */
56ccbcd7c8Schs struct loadavg averunnable;
57f2caacc7Smrg 
581e2b269dSjunyoung static void uvm_total(struct vmtotal *);
59f2caacc7Smrg 
60f2caacc7Smrg /*
6113f8d2ceSatatat  * sysctl helper routine for the vm.vmmeter node.
62f2caacc7Smrg  */
6313f8d2ceSatatat static int
sysctl_vm_meter(SYSCTLFN_ARGS)6413f8d2ceSatatat sysctl_vm_meter(SYSCTLFN_ARGS)
65f2caacc7Smrg {
6613f8d2ceSatatat 	struct sysctlnode node;
67f2caacc7Smrg 	struct vmtotal vmtotals;
68f2caacc7Smrg 
6913f8d2ceSatatat 	node = *rnode;
7013f8d2ceSatatat 	node.sysctl_data = &vmtotals;
71f2caacc7Smrg 	uvm_total(&vmtotals);
724ef57d4dSmrg 
7313f8d2ceSatatat 	return (sysctl_lookup(SYSCTLFN_CALL(&node)));
74849c9b2bSchs }
75849c9b2bSchs 
7613f8d2ceSatatat /*
7713f8d2ceSatatat  * sysctl helper routine for the vm.uvmexp node.
7813f8d2ceSatatat  */
7913f8d2ceSatatat static int
sysctl_vm_uvmexp(SYSCTLFN_ARGS)8013f8d2ceSatatat sysctl_vm_uvmexp(SYSCTLFN_ARGS)
8113f8d2ceSatatat {
8213f8d2ceSatatat 	struct sysctlnode node;
8383d071a3Schs 
84a98966d3Sad 	uvm_update_uvmexp();
85a98966d3Sad 
8613f8d2ceSatatat 	node = *rnode;
87cff1dac3Schristos 	if (oldlenp)
88d1579b2dSriastradh 		node.sysctl_size = uimin(*oldlenp, node.sysctl_size);
8983d071a3Schs 
9013f8d2ceSatatat 	return (sysctl_lookup(SYSCTLFN_CALL(&node)));
91f2caacc7Smrg }
92f2caacc7Smrg 
933c1b8a2bSsimonb static int
sysctl_vm_uvmexp2(SYSCTLFN_ARGS)9413f8d2ceSatatat sysctl_vm_uvmexp2(SYSCTLFN_ARGS)
953c1b8a2bSsimonb {
9613f8d2ceSatatat 	struct sysctlnode node;
973c1b8a2bSsimonb 	struct uvmexp_sysctl u;
989d3e3eabSyamt 	int active, inactive;
999d3e3eabSyamt 
1009d3e3eabSyamt 	uvm_estimatepageable(&active, &inactive);
1013c1b8a2bSsimonb 
10233999a42Ssimonb 	memset(&u, 0, sizeof(u));
10333999a42Ssimonb 
104ba90a6baSad 	/* uvm_availmem() will sync the counters if old. */
105ba90a6baSad 	u.free = uvm_availmem(true);
1063c1b8a2bSsimonb 	u.pagesize = uvmexp.pagesize;
1073c1b8a2bSsimonb 	u.pagemask = uvmexp.pagemask;
1083c1b8a2bSsimonb 	u.pageshift = uvmexp.pageshift;
1093c1b8a2bSsimonb 	u.npages = uvmexp.npages;
1109d3e3eabSyamt 	u.active = active;
1119d3e3eabSyamt 	u.inactive = inactive;
1123c1b8a2bSsimonb 	u.paging = uvmexp.paging;
1133c1b8a2bSsimonb 	u.wired = uvmexp.wired;
1143c1b8a2bSsimonb 	u.reserve_pagedaemon = uvmexp.reserve_pagedaemon;
1153c1b8a2bSsimonb 	u.reserve_kernel = uvmexp.reserve_kernel;
1163c1b8a2bSsimonb 	u.freemin = uvmexp.freemin;
1173c1b8a2bSsimonb 	u.freetarg = uvmexp.freetarg;
1189d3e3eabSyamt 	u.inactarg = 0; /* unused */
1193c1b8a2bSsimonb 	u.wiredmax = uvmexp.wiredmax;
1203c1b8a2bSsimonb 	u.nswapdev = uvmexp.nswapdev;
1213c1b8a2bSsimonb 	u.swpages = uvmexp.swpages;
1223c1b8a2bSsimonb 	u.swpginuse = uvmexp.swpginuse;
1233c1b8a2bSsimonb 	u.swpgonly = uvmexp.swpgonly;
1243c1b8a2bSsimonb 	u.nswget = uvmexp.nswget;
125a98966d3Sad 	u.cpuhit = cpu_count_get(CPU_COUNT_CPUHIT);
126a98966d3Sad 	u.cpumiss = cpu_count_get(CPU_COUNT_CPUMISS);
127a98966d3Sad 	u.faults = cpu_count_get(CPU_COUNT_NFAULT);
128a98966d3Sad 	u.traps = cpu_count_get(CPU_COUNT_NTRAP);
129a98966d3Sad 	u.intrs = cpu_count_get(CPU_COUNT_NINTR);
130a98966d3Sad 	u.swtch = cpu_count_get(CPU_COUNT_NSWTCH);
131a98966d3Sad 	u.softs = cpu_count_get(CPU_COUNT_NSOFT);
132a98966d3Sad 	u.syscalls = cpu_count_get(CPU_COUNT_NSYSCALL);
133a98966d3Sad 	u.pageins = cpu_count_get(CPU_COUNT_PAGEINS);
134a98966d3Sad 	u.pgswapin = 0; /* unused */
1353c1b8a2bSsimonb 	u.pgswapout = uvmexp.pgswapout;
136a98966d3Sad 	u.forks = cpu_count_get(CPU_COUNT_FORKS);
137a98966d3Sad 	u.forks_ppwait = cpu_count_get(CPU_COUNT_FORKS_PPWAIT);
138a98966d3Sad 	u.forks_sharevm = cpu_count_get(CPU_COUNT_FORKS_SHAREVM);
13992ec96a5Sad 	u.zeroaborts = uvmexp.zeroaborts;
140a98966d3Sad 	u.fltnoram = cpu_count_get(CPU_COUNT_FLTNORAM);
141a98966d3Sad 	u.fltnoanon = cpu_count_get(CPU_COUNT_FLTNOANON);
142a98966d3Sad 	u.fltpgwait = cpu_count_get(CPU_COUNT_FLTPGWAIT);
143a98966d3Sad 	u.fltpgrele = cpu_count_get(CPU_COUNT_FLTPGRELE);
144a98966d3Sad 	u.fltrelck = cpu_count_get(CPU_COUNT_FLTRELCK);
145a98966d3Sad 	u.fltrelckok = cpu_count_get(CPU_COUNT_FLTRELCKOK);
146a98966d3Sad 	u.fltanget = cpu_count_get(CPU_COUNT_FLTANGET);
147a98966d3Sad 	u.fltanretry = cpu_count_get(CPU_COUNT_FLTANRETRY);
148a98966d3Sad 	u.fltamcopy = cpu_count_get(CPU_COUNT_FLTAMCOPY);
149a98966d3Sad 	u.fltnamap = cpu_count_get(CPU_COUNT_FLTNAMAP);
150a98966d3Sad 	u.fltnomap = cpu_count_get(CPU_COUNT_FLTNOMAP);
151a98966d3Sad 	u.fltlget = cpu_count_get(CPU_COUNT_FLTLGET);
152a98966d3Sad 	u.fltget = cpu_count_get(CPU_COUNT_FLTGET);
153a98966d3Sad 	u.flt_anon = cpu_count_get(CPU_COUNT_FLT_ANON);
154a98966d3Sad 	u.flt_acow = cpu_count_get(CPU_COUNT_FLT_ACOW);
155a98966d3Sad 	u.flt_obj = cpu_count_get(CPU_COUNT_FLT_OBJ);
156a98966d3Sad 	u.flt_prcopy = cpu_count_get(CPU_COUNT_FLT_PRCOPY);
157a98966d3Sad 	u.flt_przero = cpu_count_get(CPU_COUNT_FLT_PRZERO);
1583c1b8a2bSsimonb 	u.pdwoke = uvmexp.pdwoke;
1593c1b8a2bSsimonb 	u.pdrevs = uvmexp.pdrevs;
1603c1b8a2bSsimonb 	u.pdfreed = uvmexp.pdfreed;
1613c1b8a2bSsimonb 	u.pdscans = uvmexp.pdscans;
1623c1b8a2bSsimonb 	u.pdanscan = uvmexp.pdanscan;
1633c1b8a2bSsimonb 	u.pdobscan = uvmexp.pdobscan;
1643c1b8a2bSsimonb 	u.pdreact = uvmexp.pdreact;
1653c1b8a2bSsimonb 	u.pdbusy = uvmexp.pdbusy;
1663c1b8a2bSsimonb 	u.pdpageouts = uvmexp.pdpageouts;
1673c1b8a2bSsimonb 	u.pdpending = uvmexp.pdpending;
1683c1b8a2bSsimonb 	u.pddeact = uvmexp.pddeact;
169a98966d3Sad 	u.execpages = cpu_count_get(CPU_COUNT_EXECPAGES);
170a98966d3Sad 	u.colorhit = cpu_count_get(CPU_COUNT_COLORHIT);
171a98966d3Sad 	u.colormiss = cpu_count_get(CPU_COUNT_COLORMISS);
172571ed845Smsaitoh 	u.ncolors = uvmexp.ncolors;
173277fd3d5Smrg 	u.bootpages = uvmexp.bootpages;
174277fd3d5Smrg 	u.poolpages = pool_totalpages();
175ba90a6baSad 	u.countsyncall = cpu_count_get(CPU_COUNT_SYNC);
176d305fcb5Sad 	u.anonunknown = cpu_count_get(CPU_COUNT_ANONUNKNOWN);
177d305fcb5Sad 	u.anonclean = cpu_count_get(CPU_COUNT_ANONCLEAN);
178d305fcb5Sad 	u.anondirty = cpu_count_get(CPU_COUNT_ANONDIRTY);
179d305fcb5Sad 	u.fileunknown = cpu_count_get(CPU_COUNT_FILEUNKNOWN);
180d305fcb5Sad 	u.fileclean = cpu_count_get(CPU_COUNT_FILECLEAN);
181d305fcb5Sad 	u.filedirty = cpu_count_get(CPU_COUNT_FILEDIRTY);
1821d7848adSad 	u.fltup = cpu_count_get(CPU_COUNT_FLTUP);
1831d7848adSad 	u.fltnoup = cpu_count_get(CPU_COUNT_FLTNOUP);
184ba90a6baSad 	u.anonpages = u.anonclean + u.anondirty + u.anonunknown;
185ba90a6baSad 	u.filepages = u.fileclean + u.filedirty + u.fileunknown - u.execpages;
1863c1b8a2bSsimonb 
18713f8d2ceSatatat 	node = *rnode;
18813f8d2ceSatatat 	node.sysctl_data = &u;
18913f8d2ceSatatat 	node.sysctl_size = sizeof(u);
1904df396b6Schristos 	if (oldlenp)
191d1579b2dSriastradh 		node.sysctl_size = uimin(*oldlenp, node.sysctl_size);
19213f8d2ceSatatat 	return (sysctl_lookup(SYSCTLFN_CALL(&node)));
19313f8d2ceSatatat }
19413f8d2ceSatatat 
19513f8d2ceSatatat /*
1964fce5d6fSyamt  * sysctl helper routine for uvm_pctparam.
1974fce5d6fSyamt  */
1984fce5d6fSyamt static int
uvm_sysctlpctparam(SYSCTLFN_ARGS)1999d3e3eabSyamt uvm_sysctlpctparam(SYSCTLFN_ARGS)
2004fce5d6fSyamt {
2014fce5d6fSyamt 	int t, error;
2024fce5d6fSyamt 	struct sysctlnode node;
2034fce5d6fSyamt 	struct uvm_pctparam *pct;
2044fce5d6fSyamt 
2054fce5d6fSyamt 	pct = rnode->sysctl_data;
2064fce5d6fSyamt 	t = pct->pct_pct;
2074fce5d6fSyamt 
2084fce5d6fSyamt 	node = *rnode;
2094fce5d6fSyamt 	node.sysctl_data = &t;
2104fce5d6fSyamt 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
2114fce5d6fSyamt 	if (error || newp == NULL)
2124fce5d6fSyamt 		return error;
2134fce5d6fSyamt 
2144fce5d6fSyamt 	if (t < 0 || t > 100)
2154fce5d6fSyamt 		return EINVAL;
2164fce5d6fSyamt 
2179d3e3eabSyamt 	error = uvm_pctparam_check(pct, t);
2189d3e3eabSyamt 	if (error) {
2199d3e3eabSyamt 		return error;
2209d3e3eabSyamt 	}
2214fce5d6fSyamt 	uvm_pctparam_set(pct, t);
2224fce5d6fSyamt 
2234fce5d6fSyamt 	return (0);
2244fce5d6fSyamt }
2254fce5d6fSyamt 
2264fce5d6fSyamt /*
22713f8d2ceSatatat  * uvm_sysctl: sysctl hook into UVM system.
22813f8d2ceSatatat  */
22913f8d2ceSatatat SYSCTL_SETUP(sysctl_vm_setup, "sysctl vm subtree setup")
23013f8d2ceSatatat {
23113f8d2ceSatatat 
23219af35fdSatatat 	sysctl_createv(clog, 0, NULL, NULL,
23319af35fdSatatat 		       CTLFLAG_PERMANENT,
234db2f5bebSatatat 		       CTLTYPE_STRUCT, "vmmeter",
235db2f5bebSatatat 		       SYSCTL_DESCR("Simple system-wide virtual memory "
236db2f5bebSatatat 				    "statistics"),
23713f8d2ceSatatat 		       sysctl_vm_meter, 0, NULL, sizeof(struct vmtotal),
23813f8d2ceSatatat 		       CTL_VM, VM_METER, CTL_EOL);
23919af35fdSatatat 	sysctl_createv(clog, 0, NULL, NULL,
24019af35fdSatatat 		       CTLFLAG_PERMANENT,
241db2f5bebSatatat 		       CTLTYPE_STRUCT, "loadavg",
242db2f5bebSatatat 		       SYSCTL_DESCR("System load average history"),
24313f8d2ceSatatat 		       NULL, 0, &averunnable, sizeof(averunnable),
24413f8d2ceSatatat 		       CTL_VM, VM_LOADAVG, CTL_EOL);
24519af35fdSatatat 	sysctl_createv(clog, 0, NULL, NULL,
24619af35fdSatatat 		       CTLFLAG_PERMANENT,
247db2f5bebSatatat 		       CTLTYPE_STRUCT, "uvmexp",
248db2f5bebSatatat 		       SYSCTL_DESCR("Detailed system-wide virtual memory "
249db2f5bebSatatat 				    "statistics"),
25013f8d2ceSatatat 		       sysctl_vm_uvmexp, 0, &uvmexp, sizeof(uvmexp),
25113f8d2ceSatatat 		       CTL_VM, VM_UVMEXP, CTL_EOL);
25219af35fdSatatat 	sysctl_createv(clog, 0, NULL, NULL,
25319af35fdSatatat 		       CTLFLAG_PERMANENT,
254db2f5bebSatatat 		       CTLTYPE_STRUCT, "uvmexp2",
255db2f5bebSatatat 		       SYSCTL_DESCR("Detailed system-wide virtual memory "
256db2f5bebSatatat 				    "statistics (MI)"),
25713f8d2ceSatatat 		       sysctl_vm_uvmexp2, 0, NULL, 0,
25813f8d2ceSatatat 		       CTL_VM, VM_UVMEXP2, CTL_EOL);
25919af35fdSatatat 	sysctl_createv(clog, 0, NULL, NULL,
260db2f5bebSatatat 		       CTLFLAG_PERMANENT, CTLTYPE_INT, "maxslp",
261db2f5bebSatatat 		       SYSCTL_DESCR("Maximum process sleep time before being "
262db2f5bebSatatat 				    "swapped"),
26313f8d2ceSatatat 		       NULL, 0, &maxslp, 0,
26413f8d2ceSatatat 		       CTL_VM, VM_MAXSLP, CTL_EOL);
26519af35fdSatatat 	sysctl_createv(clog, 0, NULL, NULL,
26619af35fdSatatat 		       CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
267db2f5bebSatatat 		       CTLTYPE_INT, "uspace",
268db2f5bebSatatat 		       SYSCTL_DESCR("Number of bytes allocated for a kernel "
269db2f5bebSatatat 				    "stack"),
27013f8d2ceSatatat 		       NULL, USPACE, NULL, 0,
27113f8d2ceSatatat 		       CTL_VM, VM_USPACE, CTL_EOL);
27219af35fdSatatat 	sysctl_createv(clog, 0, NULL, NULL,
273b007730cSmatt 		       CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
274b007730cSmatt 		       CTLTYPE_LONG, "minaddress",
275b007730cSmatt 		       SYSCTL_DESCR("Minimum user address"),
27687d65da0Smartin 		       NULL, VM_MIN_ADDRESS, NULL, 0,
277b007730cSmatt 		       CTL_VM, VM_MINADDRESS, CTL_EOL);
278b007730cSmatt 	sysctl_createv(clog, 0, NULL, NULL,
279b007730cSmatt 		       CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
280b007730cSmatt 		       CTLTYPE_LONG, "maxaddress",
281b007730cSmatt 		       SYSCTL_DESCR("Maximum user address"),
28287d65da0Smartin 		       NULL, VM_MAX_ADDRESS, NULL, 0,
283b007730cSmatt 		       CTL_VM, VM_MAXADDRESS, CTL_EOL);
2845f391f4aSjoerg 	sysctl_createv(clog, 0, NULL, NULL,
2855f391f4aSjoerg 		       CTLFLAG_PERMANENT|CTLFLAG_UNSIGNED,
2865f391f4aSjoerg 		       CTLTYPE_INT, "guard_size",
2875f391f4aSjoerg 		       SYSCTL_DESCR("Guard size of main thread"),
2885f391f4aSjoerg 		       NULL, 0, &user_stack_guard_size, 0,
2895f391f4aSjoerg 		       CTL_VM, VM_GUARD_SIZE, CTL_EOL);
2905f391f4aSjoerg 	sysctl_createv(clog, 0, NULL, NULL,
2915f391f4aSjoerg 		       CTLFLAG_PERMANENT|CTLFLAG_UNSIGNED|CTLFLAG_READWRITE,
2925f391f4aSjoerg 		       CTLTYPE_INT, "thread_guard_size",
2935f391f4aSjoerg 		       SYSCTL_DESCR("Guard size of other threads"),
2945f391f4aSjoerg 		       NULL, 0, &user_thread_stack_guard_size, 0,
2955f391f4aSjoerg 		       CTL_VM, VM_THREAD_GUARD_SIZE, CTL_EOL);
296a6798213Sjdolecek #ifdef PMAP_DIRECT
297a6798213Sjdolecek 	sysctl_createv(clog, 0, NULL, NULL,
298a6798213Sjdolecek 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
299a6798213Sjdolecek 		       CTLTYPE_BOOL, "ubc_direct",
300a6798213Sjdolecek 		       SYSCTL_DESCR("Use direct map for UBC I/O"),
301a6798213Sjdolecek 		       NULL, 0, &ubc_direct, 0,
302a6798213Sjdolecek 		       CTL_VM, CTL_CREATE, CTL_EOL);
303a6798213Sjdolecek #endif
3049d3e3eabSyamt 
3059d3e3eabSyamt 	uvmpdpol_sysctlsetup();
3063c1b8a2bSsimonb }
3073c1b8a2bSsimonb 
308f2caacc7Smrg /*
309f2caacc7Smrg  * uvm_total: calculate the current state of the system.
310f2caacc7Smrg  */
3114ef57d4dSmrg static void
uvm_total(struct vmtotal * totalp)312e569faccSthorpej uvm_total(struct vmtotal *totalp)
313f2caacc7Smrg {
314b78f59b4Sthorpej 	struct lwp *l;
315f2caacc7Smrg #if 0
316821ec03eSchs 	struct vm_map_entry *	entry;
317821ec03eSchs 	struct vm_map *map;
318f2caacc7Smrg 	int paging;
319f2caacc7Smrg #endif
320ddd3a0beSad 	int freepg;
3219d3e3eabSyamt 	int active;
322f2caacc7Smrg 
3232c871702Sperry 	memset(totalp, 0, sizeof *totalp);
324f2caacc7Smrg 
325f2caacc7Smrg 	/*
326f2caacc7Smrg 	 * calculate process statistics
327f2caacc7Smrg 	 */
3280eaaa024Sad 	mutex_enter(&proc_lock);
329b78f59b4Sthorpej 	LIST_FOREACH(l, &alllwp, l_list) {
330934634a1Spavel 		if (l->l_proc->p_flag & PK_SYSTEM)
331f2caacc7Smrg 			continue;
332b78f59b4Sthorpej 		switch (l->l_stat) {
333f2caacc7Smrg 		case 0:
334f2caacc7Smrg 			continue;
335f2caacc7Smrg 
336b78f59b4Sthorpej 		case LSSLEEP:
337b78f59b4Sthorpej 		case LSSTOP:
3382c376812Senami 			if ((l->l_flag & LW_SINTR) == 0) {
339f2caacc7Smrg 				totalp->t_dw++;
34040cf6f36Srmind 			} else if (l->l_slptime < maxslp) {
341f2caacc7Smrg 				totalp->t_sl++;
34240cf6f36Srmind 			}
343b78f59b4Sthorpej 			if (l->l_slptime >= maxslp)
344f2caacc7Smrg 				continue;
345f2caacc7Smrg 			break;
346f2caacc7Smrg 
347b78f59b4Sthorpej 		case LSRUN:
348b78f59b4Sthorpej 		case LSONPROC:
349b78f59b4Sthorpej 		case LSIDL:
350f2caacc7Smrg 			totalp->t_rq++;
351b78f59b4Sthorpej 			if (l->l_stat == LSIDL)
352f2caacc7Smrg 				continue;
353f2caacc7Smrg 			break;
354f2caacc7Smrg 		}
355f2caacc7Smrg 		/*
356f2caacc7Smrg 		 * note active objects
357f2caacc7Smrg 		 */
358f2caacc7Smrg #if 0
359f2caacc7Smrg 		/*
3607ff12d37Smrg 		 * XXXCDC: BOGUS!  rethink this.  in the mean time
3617ff12d37Smrg 		 * don't do it.
362f2caacc7Smrg 		 */
363f2caacc7Smrg 		paging = 0;
3647ff12d37Smrg 		vm_map_lock(map);
365f2caacc7Smrg 		for (map = &p->p_vmspace->vm_map, entry = map->header.next;
366f2caacc7Smrg 		    entry != &map->header; entry = entry->next) {
367f2caacc7Smrg 			if (entry->is_a_map || entry->is_sub_map ||
3687ff12d37Smrg 			    entry->object.uvm_obj == NULL)
369f2caacc7Smrg 				continue;
3707ff12d37Smrg 			/* XXX how to do this with uvm */
371f2caacc7Smrg 		}
3727ff12d37Smrg 		vm_map_unlock(map);
373f2caacc7Smrg 		if (paging)
374f2caacc7Smrg 			totalp->t_pw++;
375f2caacc7Smrg #endif
376f2caacc7Smrg 	}
3770eaaa024Sad 	mutex_exit(&proc_lock);
378b07ec3fcSad 
379f2caacc7Smrg 	/*
380f2caacc7Smrg 	 * Calculate object memory usage statistics.
381f2caacc7Smrg 	 */
3824b8a875aSad 	freepg = uvm_availmem(true);
3839d3e3eabSyamt 	uvm_estimatepageable(&active, NULL);
384ddd3a0beSad 	totalp->t_free = freepg;
385ddd3a0beSad 	totalp->t_vm = uvmexp.npages - freepg + uvmexp.swpginuse;
3869d3e3eabSyamt 	totalp->t_avm = active + uvmexp.swpginuse;	/* XXX */
387ddd3a0beSad 	totalp->t_rm = uvmexp.npages - freepg;
3889d3e3eabSyamt 	totalp->t_arm = active;
3897ff12d37Smrg 	totalp->t_vmshr = 0;		/* XXX */
3907ff12d37Smrg 	totalp->t_avmshr = 0;		/* XXX */
3917ff12d37Smrg 	totalp->t_rmshr = 0;		/* XXX */
3927ff12d37Smrg 	totalp->t_armshr = 0;		/* XXX */
393f2caacc7Smrg }
3944fce5d6fSyamt 
3954fce5d6fSyamt void
uvm_pctparam_set(struct uvm_pctparam * pct,int val)3964fce5d6fSyamt uvm_pctparam_set(struct uvm_pctparam *pct, int val)
3974fce5d6fSyamt {
3984fce5d6fSyamt 
3994fce5d6fSyamt 	pct->pct_pct = val;
4004fce5d6fSyamt 	pct->pct_scaled = val * UVM_PCTPARAM_SCALE / 100;
4014fce5d6fSyamt }
4029d3e3eabSyamt 
4039d3e3eabSyamt int
uvm_pctparam_get(struct uvm_pctparam * pct)4049d3e3eabSyamt uvm_pctparam_get(struct uvm_pctparam *pct)
4059d3e3eabSyamt {
4069d3e3eabSyamt 
4079d3e3eabSyamt 	return pct->pct_pct;
4089d3e3eabSyamt }
4099d3e3eabSyamt 
4109d3e3eabSyamt int
uvm_pctparam_check(struct uvm_pctparam * pct,int val)4119d3e3eabSyamt uvm_pctparam_check(struct uvm_pctparam *pct, int val)
4129d3e3eabSyamt {
4139d3e3eabSyamt 
4149d3e3eabSyamt 	if (pct->pct_check == NULL) {
4159d3e3eabSyamt 		return 0;
4169d3e3eabSyamt 	}
4179d3e3eabSyamt 	return (*pct->pct_check)(pct, val);
4189d3e3eabSyamt }
4199d3e3eabSyamt 
4209d3e3eabSyamt void
uvm_pctparam_init(struct uvm_pctparam * pct,int val,int (* fn)(struct uvm_pctparam *,int))4219d3e3eabSyamt uvm_pctparam_init(struct uvm_pctparam *pct, int val,
4229d3e3eabSyamt     int (*fn)(struct uvm_pctparam *, int))
4239d3e3eabSyamt {
4249d3e3eabSyamt 
4259d3e3eabSyamt 	pct->pct_check = fn;
4269d3e3eabSyamt 	uvm_pctparam_set(pct, val);
4279d3e3eabSyamt }
4289d3e3eabSyamt 
4299d3e3eabSyamt int
uvm_pctparam_createsysctlnode(struct uvm_pctparam * pct,const char * name,const char * desc)4309d3e3eabSyamt uvm_pctparam_createsysctlnode(struct uvm_pctparam *pct, const char *name,
4311a7bc55dSyamt     const char *desc)
4329d3e3eabSyamt {
4339d3e3eabSyamt 
4349d3e3eabSyamt 	return sysctl_createv(NULL, 0, NULL, NULL,
4359d3e3eabSyamt 	    CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
4369d3e3eabSyamt 	    CTLTYPE_INT, name, SYSCTL_DESCR(desc),
437e21a34c2Sdsl 	    uvm_sysctlpctparam, 0, (void *)pct, 0, CTL_VM, CTL_CREATE, CTL_EOL);
4389d3e3eabSyamt }
439a98966d3Sad 
440a98966d3Sad /*
441a98966d3Sad  * Update uvmexp with aggregate values from the per-CPU counters.
442a98966d3Sad  */
443a98966d3Sad void
uvm_update_uvmexp(void)444a98966d3Sad uvm_update_uvmexp(void)
445a98966d3Sad {
446a98966d3Sad 
447ba90a6baSad 	/* uvm_availmem() will sync the counters if old. */
4484b8a875aSad 	uvmexp.free = (int)uvm_availmem(true);
449a98966d3Sad 	uvmexp.cpuhit = (int)cpu_count_get(CPU_COUNT_CPUHIT);
450a98966d3Sad 	uvmexp.cpumiss = (int)cpu_count_get(CPU_COUNT_CPUMISS);
451a98966d3Sad 	uvmexp.faults = (int)cpu_count_get(CPU_COUNT_NFAULT);
452a98966d3Sad 	uvmexp.traps = (int)cpu_count_get(CPU_COUNT_NTRAP);
453a98966d3Sad 	uvmexp.intrs = (int)cpu_count_get(CPU_COUNT_NINTR);
454a98966d3Sad 	uvmexp.swtch = (int)cpu_count_get(CPU_COUNT_NSWTCH);
455a98966d3Sad 	uvmexp.softs = (int)cpu_count_get(CPU_COUNT_NSOFT);
456a98966d3Sad 	uvmexp.syscalls = (int)cpu_count_get(CPU_COUNT_NSYSCALL);
457a98966d3Sad 	uvmexp.pageins = (int)cpu_count_get(CPU_COUNT_PAGEINS);
458a98966d3Sad 	uvmexp.forks = (int)cpu_count_get(CPU_COUNT_FORKS);
459a98966d3Sad 	uvmexp.forks_ppwait = (int)cpu_count_get(CPU_COUNT_FORKS_PPWAIT);
460a98966d3Sad 	uvmexp.forks_sharevm = (int)cpu_count_get(CPU_COUNT_FORKS_SHAREVM);
461a98966d3Sad 	uvmexp.fltnoram = (int)cpu_count_get(CPU_COUNT_FLTNORAM);
462a98966d3Sad 	uvmexp.fltnoanon = (int)cpu_count_get(CPU_COUNT_FLTNOANON);
463a98966d3Sad 	uvmexp.fltpgwait = (int)cpu_count_get(CPU_COUNT_FLTPGWAIT);
464a98966d3Sad 	uvmexp.fltpgrele = (int)cpu_count_get(CPU_COUNT_FLTPGRELE);
465a98966d3Sad 	uvmexp.fltrelck = (int)cpu_count_get(CPU_COUNT_FLTRELCK);
466a98966d3Sad 	uvmexp.fltrelckok = (int)cpu_count_get(CPU_COUNT_FLTRELCKOK);
467a98966d3Sad 	uvmexp.fltanget = (int)cpu_count_get(CPU_COUNT_FLTANGET);
468a98966d3Sad 	uvmexp.fltanretry = (int)cpu_count_get(CPU_COUNT_FLTANRETRY);
469a98966d3Sad 	uvmexp.fltamcopy = (int)cpu_count_get(CPU_COUNT_FLTAMCOPY);
470a98966d3Sad 	uvmexp.fltnamap = (int)cpu_count_get(CPU_COUNT_FLTNAMAP);
471a98966d3Sad 	uvmexp.fltnomap = (int)cpu_count_get(CPU_COUNT_FLTNOMAP);
472a98966d3Sad 	uvmexp.fltlget = (int)cpu_count_get(CPU_COUNT_FLTLGET);
473a98966d3Sad 	uvmexp.fltget = (int)cpu_count_get(CPU_COUNT_FLTGET);
474a98966d3Sad 	uvmexp.flt_anon = (int)cpu_count_get(CPU_COUNT_FLT_ANON);
475a98966d3Sad 	uvmexp.flt_acow = (int)cpu_count_get(CPU_COUNT_FLT_ACOW);
476a98966d3Sad 	uvmexp.flt_obj = (int)cpu_count_get(CPU_COUNT_FLT_OBJ);
477a98966d3Sad 	uvmexp.flt_prcopy = (int)cpu_count_get(CPU_COUNT_FLT_PRCOPY);
478a98966d3Sad 	uvmexp.flt_przero = (int)cpu_count_get(CPU_COUNT_FLT_PRZERO);
479ba90a6baSad 	uvmexp.anonpages = (int)(cpu_count_get(CPU_COUNT_ANONCLEAN) +
480ba90a6baSad 	    cpu_count_get(CPU_COUNT_ANONDIRTY) +
481ba90a6baSad 	    cpu_count_get(CPU_COUNT_ANONUNKNOWN));
482ba90a6baSad     	uvmexp.filepages = (int)(cpu_count_get(CPU_COUNT_FILECLEAN) +
483ba90a6baSad 	    cpu_count_get(CPU_COUNT_FILEDIRTY) +
484ba90a6baSad 	    cpu_count_get(CPU_COUNT_FILEUNKNOWN) -
485ba90a6baSad 	    cpu_count_get(CPU_COUNT_EXECPAGES));
486a98966d3Sad 	uvmexp.execpages = (int)cpu_count_get(CPU_COUNT_EXECPAGES);
487a98966d3Sad 	uvmexp.colorhit = (int)cpu_count_get(CPU_COUNT_COLORHIT);
488a98966d3Sad 	uvmexp.colormiss = (int)cpu_count_get(CPU_COUNT_COLORMISS);
489a98966d3Sad }
490