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