xref: /freebsd/sys/vm/vm_meter.c (revision cc64b484dd5bb8207409838e82b6d0e37a0cfbc1)
1df8bae1dSRodney W. Grimes /*
2df8bae1dSRodney W. Grimes  * Copyright (c) 1982, 1986, 1989, 1993
3df8bae1dSRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
4df8bae1dSRodney W. Grimes  *
5df8bae1dSRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
6df8bae1dSRodney W. Grimes  * modification, are permitted provided that the following conditions
7df8bae1dSRodney W. Grimes  * are met:
8df8bae1dSRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
9df8bae1dSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
10df8bae1dSRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
11df8bae1dSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
12df8bae1dSRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
13df8bae1dSRodney W. Grimes  * 3. All advertising materials mentioning features or use of this software
145929bcfaSPhilippe Charnier  *    must display the following acknowledgement:
15df8bae1dSRodney W. Grimes  *	This product includes software developed by the University of
16df8bae1dSRodney W. Grimes  *	California, Berkeley and its contributors.
17df8bae1dSRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
18df8bae1dSRodney W. Grimes  *    may be used to endorse or promote products derived from this software
19df8bae1dSRodney W. Grimes  *    without specific prior written permission.
20df8bae1dSRodney W. Grimes  *
21df8bae1dSRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22df8bae1dSRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23df8bae1dSRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24df8bae1dSRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25df8bae1dSRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26df8bae1dSRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27df8bae1dSRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28df8bae1dSRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29df8bae1dSRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30df8bae1dSRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31df8bae1dSRodney W. Grimes  * SUCH DAMAGE.
32df8bae1dSRodney W. Grimes  *
33df8bae1dSRodney W. Grimes  *	@(#)vm_meter.c	8.4 (Berkeley) 1/4/94
34c3aac50fSPeter Wemm  * $FreeBSD$
35df8bae1dSRodney W. Grimes  */
36df8bae1dSRodney W. Grimes 
37df8bae1dSRodney W. Grimes #include <sys/param.h>
38df8bae1dSRodney W. Grimes #include <sys/proc.h>
39df8bae1dSRodney W. Grimes #include <sys/systm.h>
40df8bae1dSRodney W. Grimes #include <sys/kernel.h>
4108637435SBruce Evans #include <sys/resource.h>
421005a129SJohn Baldwin #include <sys/sx.h>
43efeaf95aSDavid Greenman #include <sys/vmmeter.h>
44efeaf95aSDavid Greenman 
45df8bae1dSRodney W. Grimes #include <vm/vm.h>
46b0359e2cSPeter Wemm #include <vm/vm_page.h>
479b4288a3SBruce Evans #include <vm/vm_extern.h>
48efeaf95aSDavid Greenman #include <vm/vm_param.h>
49996c772fSJohn Dyson #include <sys/lock.h>
50efeaf95aSDavid Greenman #include <vm/pmap.h>
51efeaf95aSDavid Greenman #include <vm/vm_map.h>
52efeaf95aSDavid Greenman #include <vm/vm_object.h>
53df8bae1dSRodney W. Grimes #include <sys/sysctl.h>
54df8bae1dSRodney W. Grimes 
55946bb7a2SPoul-Henning Kamp struct loadavg averunnable =
56946bb7a2SPoul-Henning Kamp 	{ {0, 0, 0}, FSCALE };	/* load average, of runnable procs */
57946bb7a2SPoul-Henning Kamp 
5828f8db14SBruce Evans struct vmmeter cnt;
59df8bae1dSRodney W. Grimes 
60f708ef1bSPoul-Henning Kamp static int maxslp = MAXSLP;
61df8bae1dSRodney W. Grimes 
62df8bae1dSRodney W. Grimes /*
63df8bae1dSRodney W. Grimes  * Constants for averages over 1, 5, and 15 minutes
64df8bae1dSRodney W. Grimes  * when sampling at 5 second intervals.
65df8bae1dSRodney W. Grimes  */
66f708ef1bSPoul-Henning Kamp static fixpt_t cexp[3] = {
67df8bae1dSRodney W. Grimes 	0.9200444146293232 * FSCALE,	/* exp(-1/12) */
68df8bae1dSRodney W. Grimes 	0.9834714538216174 * FSCALE,	/* exp(-1/60) */
69df8bae1dSRodney W. Grimes 	0.9944598480048967 * FSCALE,	/* exp(-1/180) */
70df8bae1dSRodney W. Grimes };
71df8bae1dSRodney W. Grimes 
72df8bae1dSRodney W. Grimes /*
73df8bae1dSRodney W. Grimes  * Compute a tenex style load average of a quantity on
74df8bae1dSRodney W. Grimes  * 1, 5 and 15 minute intervals.
75df8bae1dSRodney W. Grimes  */
7624a1cce3SDavid Greenman static void
77a9ad941cSPoul-Henning Kamp loadav(struct loadavg *avg)
78df8bae1dSRodney W. Grimes {
79df8bae1dSRodney W. Grimes 	register int i, nrun;
80df8bae1dSRodney W. Grimes 	register struct proc *p;
81df8bae1dSRodney W. Grimes 
821005a129SJohn Baldwin 	sx_slock(&allproc_lock);
83fc2ffbe6SPoul-Henning Kamp 	for (nrun = 0, p = LIST_FIRST(&allproc); p != 0; p = LIST_NEXT(p, p_list)) {
84df8bae1dSRodney W. Grimes 		switch (p->p_stat) {
85df8bae1dSRodney W. Grimes 		case SSLEEP:
86d5a08a60SJake Burkholder 			if (p->p_pri.pri_level > PZERO ||
87d5a08a60SJake Burkholder 			    p->p_slptime != 0)
88df8bae1dSRodney W. Grimes 				continue;
89956f3135SPhilippe Charnier 			/* FALLTHROUGH */
90df8bae1dSRodney W. Grimes 		case SRUN:
917ab37af1SJohn Baldwin 			if ((p->p_flag & P_NOLOAD) != 0)
927ab37af1SJohn Baldwin 				continue;
937ab37af1SJohn Baldwin 			/* FALLTHROUGH */
94df8bae1dSRodney W. Grimes 		case SIDL:
95df8bae1dSRodney W. Grimes 			nrun++;
96df8bae1dSRodney W. Grimes 		}
97df8bae1dSRodney W. Grimes 	}
981005a129SJohn Baldwin 	sx_sunlock(&allproc_lock);
99df8bae1dSRodney W. Grimes 	for (i = 0; i < 3; i++)
100df8bae1dSRodney W. Grimes 		avg->ldavg[i] = (cexp[i] * avg->ldavg[i] +
101df8bae1dSRodney W. Grimes 		    nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT;
102df8bae1dSRodney W. Grimes }
103df8bae1dSRodney W. Grimes 
10424a1cce3SDavid Greenman void
10524a1cce3SDavid Greenman vmmeter()
10624a1cce3SDavid Greenman {
10724a1cce3SDavid Greenman 
108227ee8a1SPoul-Henning Kamp 	if (time_second % 5 == 0)
10924a1cce3SDavid Greenman 		loadav(&averunnable);
11024a1cce3SDavid Greenman 	if (proc0.p_slptime > maxslp / 2)
11124a1cce3SDavid Greenman 		wakeup(&proc0);
11224a1cce3SDavid Greenman }
11324a1cce3SDavid Greenman 
1149701cd40SJohn Baldwin SYSCTL_UINT(_vm, VM_V_FREE_MIN, v_free_min,
115a9ad941cSPoul-Henning Kamp 	CTLFLAG_RW, &cnt.v_free_min, 0, "");
1169701cd40SJohn Baldwin SYSCTL_UINT(_vm, VM_V_FREE_TARGET, v_free_target,
117a9ad941cSPoul-Henning Kamp 	CTLFLAG_RW, &cnt.v_free_target, 0, "");
1189701cd40SJohn Baldwin SYSCTL_UINT(_vm, VM_V_FREE_RESERVED, v_free_reserved,
119a9ad941cSPoul-Henning Kamp 	CTLFLAG_RW, &cnt.v_free_reserved, 0, "");
1209701cd40SJohn Baldwin SYSCTL_UINT(_vm, VM_V_INACTIVE_TARGET, v_inactive_target,
121a9ad941cSPoul-Henning Kamp 	CTLFLAG_RW, &cnt.v_inactive_target, 0, "");
1229701cd40SJohn Baldwin SYSCTL_UINT(_vm, VM_V_CACHE_MIN, v_cache_min,
123a9ad941cSPoul-Henning Kamp 	CTLFLAG_RW, &cnt.v_cache_min, 0, "");
1249701cd40SJohn Baldwin SYSCTL_UINT(_vm, VM_V_CACHE_MAX, v_cache_max,
125a9ad941cSPoul-Henning Kamp 	CTLFLAG_RW, &cnt.v_cache_max, 0, "");
1269701cd40SJohn Baldwin SYSCTL_UINT(_vm, VM_V_PAGEOUT_FREE_MIN, v_pageout_free_min,
127a9ad941cSPoul-Henning Kamp 	CTLFLAG_RW, &cnt.v_pageout_free_min, 0, "");
1289701cd40SJohn Baldwin SYSCTL_UINT(_vm, OID_AUTO, v_free_severe,
12990ecac61SMatthew Dillon 	CTLFLAG_RW, &cnt.v_free_severe, 0, "");
130a9ad941cSPoul-Henning Kamp 
1313d177f46SBill Fumerola SYSCTL_STRUCT(_vm, VM_LOADAVG, loadavg, CTLFLAG_RD,
1323d177f46SBill Fumerola     &averunnable, loadavg, "Machine loadaverage history");
133a9ad941cSPoul-Henning Kamp 
134a9ad941cSPoul-Henning Kamp static int
13582d9ae4eSPoul-Henning Kamp vmtotal(SYSCTL_HANDLER_ARGS)
136df8bae1dSRodney W. Grimes {
137a9ad941cSPoul-Henning Kamp 	struct proc *p;
138a9ad941cSPoul-Henning Kamp 	struct vmtotal total, *totalp;
139a9ad941cSPoul-Henning Kamp 	vm_map_entry_t entry;
140a9ad941cSPoul-Henning Kamp 	vm_object_t object;
141a9ad941cSPoul-Henning Kamp 	vm_map_t map;
142df8bae1dSRodney W. Grimes 	int paging;
143df8bae1dSRodney W. Grimes 
144a9ad941cSPoul-Henning Kamp 	totalp = &total;
145df8bae1dSRodney W. Grimes 	bzero(totalp, sizeof *totalp);
146df8bae1dSRodney W. Grimes 	/*
147df8bae1dSRodney W. Grimes 	 * Mark all objects as inactive.
148df8bae1dSRodney W. Grimes 	 */
1498606d880SJohn Baldwin 	TAILQ_FOREACH(object, &vm_object_list, object_list)
150069e9bc1SDoug Rabson 		vm_object_clear_flag(object, OBJ_ACTIVE);
151df8bae1dSRodney W. Grimes 	/*
152df8bae1dSRodney W. Grimes 	 * Calculate process statistics.
153df8bae1dSRodney W. Grimes 	 */
1541005a129SJohn Baldwin 	sx_slock(&allproc_lock);
1558606d880SJohn Baldwin 	LIST_FOREACH(p, &allproc, p_list) {
156df8bae1dSRodney W. Grimes 		if (p->p_flag & P_SYSTEM)
157df8bae1dSRodney W. Grimes 			continue;
1589ed346baSBosko Milekic 		mtx_lock_spin(&sched_lock);
159df8bae1dSRodney W. Grimes 		switch (p->p_stat) {
160df8bae1dSRodney W. Grimes 		case 0:
1619ed346baSBosko Milekic 			mtx_unlock_spin(&sched_lock);
162df8bae1dSRodney W. Grimes 			continue;
163df8bae1dSRodney W. Grimes 
1640384fff8SJason Evans 		case SMTX:
165df8bae1dSRodney W. Grimes 		case SSLEEP:
166df8bae1dSRodney W. Grimes 		case SSTOP:
1678606d880SJohn Baldwin 			if (p->p_sflag & PS_INMEM) {
168d5a08a60SJake Burkholder 				if (p->p_pri.pri_level <= PZERO)
169df8bae1dSRodney W. Grimes 					totalp->t_dw++;
170df8bae1dSRodney W. Grimes 				else if (p->p_slptime < maxslp)
171df8bae1dSRodney W. Grimes 					totalp->t_sl++;
172df8bae1dSRodney W. Grimes 			} else if (p->p_slptime < maxslp)
173df8bae1dSRodney W. Grimes 				totalp->t_sw++;
1748606d880SJohn Baldwin 			if (p->p_slptime >= maxslp) {
1759ed346baSBosko Milekic 				mtx_unlock_spin(&sched_lock);
176df8bae1dSRodney W. Grimes 				continue;
1778606d880SJohn Baldwin 			}
178df8bae1dSRodney W. Grimes 			break;
179df8bae1dSRodney W. Grimes 
1800384fff8SJason Evans 		case SWAIT:
1810384fff8SJason Evans 			totalp->t_sl++;
1820384fff8SJason Evans 			continue;
1830384fff8SJason Evans 
184df8bae1dSRodney W. Grimes 		case SRUN:
185df8bae1dSRodney W. Grimes 		case SIDL:
1868606d880SJohn Baldwin 			if (p->p_sflag & PS_INMEM)
187df8bae1dSRodney W. Grimes 				totalp->t_rq++;
188df8bae1dSRodney W. Grimes 			else
189df8bae1dSRodney W. Grimes 				totalp->t_sw++;
1908606d880SJohn Baldwin 			if (p->p_stat == SIDL) {
1919ed346baSBosko Milekic 				mtx_unlock_spin(&sched_lock);
192df8bae1dSRodney W. Grimes 				continue;
1938606d880SJohn Baldwin 			}
194df8bae1dSRodney W. Grimes 			break;
195df8bae1dSRodney W. Grimes 		}
1969ed346baSBosko Milekic 		mtx_unlock_spin(&sched_lock);
197df8bae1dSRodney W. Grimes 		/*
198df8bae1dSRodney W. Grimes 		 * Note active objects.
199df8bae1dSRodney W. Grimes 		 */
200df8bae1dSRodney W. Grimes 		paging = 0;
201df8bae1dSRodney W. Grimes 		for (map = &p->p_vmspace->vm_map, entry = map->header.next;
202df8bae1dSRodney W. Grimes 		    entry != &map->header; entry = entry->next) {
2039fdfe602SMatthew Dillon 			if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) ||
204df8bae1dSRodney W. Grimes 			    entry->object.vm_object == NULL)
205df8bae1dSRodney W. Grimes 				continue;
206069e9bc1SDoug Rabson 			vm_object_set_flag(entry->object.vm_object, OBJ_ACTIVE);
207df8bae1dSRodney W. Grimes 			paging |= entry->object.vm_object->paging_in_progress;
208df8bae1dSRodney W. Grimes 		}
209df8bae1dSRodney W. Grimes 		if (paging)
210df8bae1dSRodney W. Grimes 			totalp->t_pw++;
211df8bae1dSRodney W. Grimes 	}
2121005a129SJohn Baldwin 	sx_sunlock(&allproc_lock);
213df8bae1dSRodney W. Grimes 	/*
214df8bae1dSRodney W. Grimes 	 * Calculate object memory usage statistics.
215df8bae1dSRodney W. Grimes 	 */
216cc64b484SAlfred Perlstein 	TAILQ_FOREACH(object, &vm_object_list, object_list) {
2171c7c3c6aSMatthew Dillon 		/*
2181c7c3c6aSMatthew Dillon 		 * devices, like /dev/mem, will badly skew our totals
2191c7c3c6aSMatthew Dillon 		 */
2201c7c3c6aSMatthew Dillon 		if (object->type == OBJT_DEVICE)
2211c7c3c6aSMatthew Dillon 			continue;
2225070c7f8SJohn Dyson 		totalp->t_vm += object->size;
223df8bae1dSRodney W. Grimes 		totalp->t_rm += object->resident_page_count;
224df8bae1dSRodney W. Grimes 		if (object->flags & OBJ_ACTIVE) {
2255070c7f8SJohn Dyson 			totalp->t_avm += object->size;
226df8bae1dSRodney W. Grimes 			totalp->t_arm += object->resident_page_count;
227df8bae1dSRodney W. Grimes 		}
2285070c7f8SJohn Dyson 		if (object->shadow_count > 1) {
229df8bae1dSRodney W. Grimes 			/* shared object */
2305070c7f8SJohn Dyson 			totalp->t_vmshr += object->size;
231df8bae1dSRodney W. Grimes 			totalp->t_rmshr += object->resident_page_count;
232df8bae1dSRodney W. Grimes 			if (object->flags & OBJ_ACTIVE) {
2335070c7f8SJohn Dyson 				totalp->t_avmshr += object->size;
234df8bae1dSRodney W. Grimes 				totalp->t_armshr += object->resident_page_count;
235df8bae1dSRodney W. Grimes 			}
236df8bae1dSRodney W. Grimes 		}
237df8bae1dSRodney W. Grimes 	}
2380d94caffSDavid Greenman 	totalp->t_free = cnt.v_free_count + cnt.v_cache_count;
239a9ad941cSPoul-Henning Kamp 	return (sysctl_handle_opaque(oidp, totalp, sizeof total, req));
240df8bae1dSRodney W. Grimes }
241a9ad941cSPoul-Henning Kamp 
242a9ad941cSPoul-Henning Kamp SYSCTL_PROC(_vm, VM_METER, vmmeter, CTLTYPE_OPAQUE|CTLFLAG_RD,
2433d177f46SBill Fumerola     0, sizeof(struct vmtotal), vmtotal, "S,vmtotal",
2443d177f46SBill Fumerola     "System virtual memory statistics");
245b0359e2cSPeter Wemm SYSCTL_NODE(_vm, OID_AUTO, stats, CTLFLAG_RW, 0, "VM meter stats");
246b0359e2cSPeter Wemm SYSCTL_NODE(_vm_stats, OID_AUTO, sys, CTLFLAG_RW, 0, "VM meter sys stats");
247b0359e2cSPeter Wemm SYSCTL_NODE(_vm_stats, OID_AUTO, vm, CTLFLAG_RW, 0, "VM meter vm stats");
248b0359e2cSPeter Wemm SYSCTL_NODE(_vm_stats, OID_AUTO, misc, CTLFLAG_RW, 0, "VM meter misc stats");
2499701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
250b0359e2cSPeter Wemm 	v_swtch, CTLFLAG_RD, &cnt.v_swtch, 0, "Context switches");
2519701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
252b0359e2cSPeter Wemm 	v_trap, CTLFLAG_RD, &cnt.v_trap, 0, "Traps");
2539701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_sys, OID_AUTO,
254b0359e2cSPeter Wemm 	v_syscall, CTLFLAG_RD, &cnt.v_syscall, 0, "Syscalls");
2559701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_sys, OID_AUTO, v_intr, CTLFLAG_RD,
2563d177f46SBill Fumerola     &cnt.v_intr, 0, "Hardware interrupts");
2579701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_sys, OID_AUTO, v_soft, CTLFLAG_RD,
2583d177f46SBill Fumerola     &cnt.v_soft, 0, "Software interrupts");
2599701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
260b0359e2cSPeter Wemm 	v_vm_faults, CTLFLAG_RD, &cnt.v_vm_faults, 0, "VM faults");
2619701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
262b0359e2cSPeter Wemm 	v_cow_faults, CTLFLAG_RD, &cnt.v_cow_faults, 0, "COW faults");
2639701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
264b0359e2cSPeter Wemm 	v_cow_optim, CTLFLAG_RD, &cnt.v_cow_optim, 0, "Optimized COW faults");
2659701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
266b0359e2cSPeter Wemm 	v_zfod, CTLFLAG_RD, &cnt.v_zfod, 0, "Zero fill");
2679701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
268b0359e2cSPeter Wemm 	v_ozfod, CTLFLAG_RD, &cnt.v_ozfod, 0, "Optimized zero fill");
2699701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
270b0359e2cSPeter Wemm 	v_swapin, CTLFLAG_RD, &cnt.v_swapin, 0, "Swapin operations");
2719701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
272b0359e2cSPeter Wemm 	v_swapout, CTLFLAG_RD, &cnt.v_swapout, 0, "Swapout operations");
2739701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
274b0359e2cSPeter Wemm 	v_swappgsin, CTLFLAG_RD, &cnt.v_swappgsin, 0, "Swapin pages");
2759701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
276b0359e2cSPeter Wemm 	v_swappgsout, CTLFLAG_RD, &cnt.v_swappgsout, 0, "Swapout pages");
2779701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
278b0359e2cSPeter Wemm 	v_vnodein, CTLFLAG_RD, &cnt.v_vnodein, 0, "Vnodein operations");
2799701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
280b0359e2cSPeter Wemm 	v_vnodeout, CTLFLAG_RD, &cnt.v_vnodeout, 0, "Vnodeout operations");
2819701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
282b0359e2cSPeter Wemm 	v_vnodepgsin, CTLFLAG_RD, &cnt.v_vnodepgsin, 0, "Vnodein pages");
2839701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
284b0359e2cSPeter Wemm 	v_vnodepgsout, CTLFLAG_RD, &cnt.v_vnodepgsout, 0, "Vnodeout pages");
2859701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
286b0359e2cSPeter Wemm 	v_intrans, CTLFLAG_RD, &cnt.v_intrans, 0, "In transit page blocking");
2879701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
288b0359e2cSPeter Wemm 	v_reactivated, CTLFLAG_RD, &cnt.v_reactivated, 0, "Reactivated pages");
2899701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
290b0359e2cSPeter Wemm 	v_pdwakeups, CTLFLAG_RD, &cnt.v_pdwakeups, 0, "Pagedaemon wakeups");
2919701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
292b0359e2cSPeter Wemm 	v_pdpages, CTLFLAG_RD, &cnt.v_pdpages, 0, "Pagedaemon page scans");
2939701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
294b0359e2cSPeter Wemm 	v_dfree, CTLFLAG_RD, &cnt.v_dfree, 0, "");
2959701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
296b0359e2cSPeter Wemm 	v_pfree, CTLFLAG_RD, &cnt.v_pfree, 0, "");
2979701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
298b0359e2cSPeter Wemm 	v_tfree, CTLFLAG_RD, &cnt.v_tfree, 0, "");
2999701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
300b0359e2cSPeter Wemm 	v_page_size, CTLFLAG_RD, &cnt.v_page_size, 0, "");
3019701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
302b0359e2cSPeter Wemm 	v_page_count, CTLFLAG_RD, &cnt.v_page_count, 0, "");
3039701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
304b0359e2cSPeter Wemm 	v_free_reserved, CTLFLAG_RD, &cnt.v_free_reserved, 0, "");
3059701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
306b0359e2cSPeter Wemm 	v_free_target, CTLFLAG_RD, &cnt.v_free_target, 0, "");
3079701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
308b0359e2cSPeter Wemm 	v_free_min, CTLFLAG_RD, &cnt.v_free_min, 0, "");
3099701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
310b0359e2cSPeter Wemm 	v_free_count, CTLFLAG_RD, &cnt.v_free_count, 0, "");
3119701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
312b0359e2cSPeter Wemm 	v_wire_count, CTLFLAG_RD, &cnt.v_wire_count, 0, "");
3139701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
314b0359e2cSPeter Wemm 	v_active_count, CTLFLAG_RD, &cnt.v_active_count, 0, "");
3159701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
316b0359e2cSPeter Wemm 	v_inactive_target, CTLFLAG_RD, &cnt.v_inactive_target, 0, "");
3179701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
318b0359e2cSPeter Wemm 	v_inactive_count, CTLFLAG_RD, &cnt.v_inactive_count, 0, "");
3199701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
320b0359e2cSPeter Wemm 	v_cache_count, CTLFLAG_RD, &cnt.v_cache_count, 0, "");
3219701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
322b0359e2cSPeter Wemm 	v_cache_min, CTLFLAG_RD, &cnt.v_cache_min, 0, "");
3239701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
324b0359e2cSPeter Wemm 	v_cache_max, CTLFLAG_RD, &cnt.v_cache_max, 0, "");
3259701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
326b0359e2cSPeter Wemm 	v_pageout_free_min, CTLFLAG_RD, &cnt.v_pageout_free_min, 0, "");
3279701cd40SJohn Baldwin SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
328b0359e2cSPeter Wemm 	v_interrupt_free_min, CTLFLAG_RD, &cnt.v_interrupt_free_min, 0, "");
329b0359e2cSPeter Wemm SYSCTL_INT(_vm_stats_misc, OID_AUTO,
330b0359e2cSPeter Wemm 	zero_page_count, CTLFLAG_RD, &vm_page_zero_count, 0, "");
3315d22597fSHajimu UMEMOTO SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
3325d22597fSHajimu UMEMOTO 	v_forks, CTLFLAG_RD, &cnt.v_forks, 0, "Number of fork() calls");
3335d22597fSHajimu UMEMOTO SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
3345d22597fSHajimu UMEMOTO 	v_vforks, CTLFLAG_RD, &cnt.v_vforks, 0, "Number of vfork() calls");
3355d22597fSHajimu UMEMOTO SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
3365d22597fSHajimu UMEMOTO 	v_rforks, CTLFLAG_RD, &cnt.v_rforks, 0, "Number of rfork() calls");
3375d22597fSHajimu UMEMOTO SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
3385d22597fSHajimu UMEMOTO 	v_kthreads, CTLFLAG_RD, &cnt.v_kthreads, 0, "Number of fork() calls by kernel");
3395d22597fSHajimu UMEMOTO SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
3405d22597fSHajimu UMEMOTO 	v_forkpages, CTLFLAG_RD, &cnt.v_forkpages, 0, "VM pages affected by fork()");
3415d22597fSHajimu UMEMOTO SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
3425d22597fSHajimu UMEMOTO 	v_vforkpages, CTLFLAG_RD, &cnt.v_vforkpages, 0, "VM pages affected by vfork()");
3435d22597fSHajimu UMEMOTO SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
3445d22597fSHajimu UMEMOTO 	v_rforkpages, CTLFLAG_RD, &cnt.v_rforkpages, 0, "VM pages affected by rfork()");
3455d22597fSHajimu UMEMOTO SYSCTL_UINT(_vm_stats_vm, OID_AUTO,
3465d22597fSHajimu UMEMOTO 	v_kthreadpages, CTLFLAG_RD, &cnt.v_kthreadpages, 0, "VM pages affected by fork() by kernel");
347b0359e2cSPeter Wemm #if 0
348b0359e2cSPeter Wemm SYSCTL_INT(_vm_stats_misc, OID_AUTO,
349b0359e2cSPeter Wemm 	page_mask, CTLFLAG_RD, &page_mask, 0, "");
350b0359e2cSPeter Wemm SYSCTL_INT(_vm_stats_misc, OID_AUTO,
351b0359e2cSPeter Wemm 	page_shift, CTLFLAG_RD, &page_shift, 0, "");
352b0359e2cSPeter Wemm SYSCTL_INT(_vm_stats_misc, OID_AUTO,
353b0359e2cSPeter Wemm 	first_page, CTLFLAG_RD, &first_page, 0, "");
354b0359e2cSPeter Wemm SYSCTL_INT(_vm_stats_misc, OID_AUTO,
355b0359e2cSPeter Wemm 	last_page, CTLFLAG_RD, &last_page, 0, "");
356b0359e2cSPeter Wemm SYSCTL_INT(_vm_stats_misc, OID_AUTO,
357b0359e2cSPeter Wemm 	vm_page_bucket_count, CTLFLAG_RD, &vm_page_bucket_count, 0, "");
358b0359e2cSPeter Wemm SYSCTL_INT(_vm_stats_misc, OID_AUTO,
359b0359e2cSPeter Wemm 	vm_page_hash_mask, CTLFLAG_RD, &vm_page_hash_mask, 0, "");
360b0359e2cSPeter Wemm #endif
361368d2edcSThomas Moestl 
362368d2edcSThomas Moestl /*
363368d2edcSThomas Moestl  * Further sysctls used by systat: hw.nintr, hw.intrnames, hw.intrcnt.
364368d2edcSThomas Moestl  * This does probably not really fit in here, but it is somehow connected.
365368d2edcSThomas Moestl  * The definitions for this are machdep, but are currently defined for
366368d2edcSThomas Moestl  * any architecture.
367368d2edcSThomas Moestl  */
368368d2edcSThomas Moestl 
369368d2edcSThomas Moestl /* include the machdep stuff */
370368d2edcSThomas Moestl #include <machine/intrcnt.h>
371368d2edcSThomas Moestl 
372368d2edcSThomas Moestl int nintr = INTRCNT_COUNT;
373368d2edcSThomas Moestl SYSCTL_INT(_hw, OID_AUTO, nintr, CTLFLAG_RD, &nintr, 0, "Number of Interrupts");
374368d2edcSThomas Moestl 
375368d2edcSThomas Moestl SYSCTL_OPAQUE(_hw, OID_AUTO, intrcnt, CTLFLAG_RD, &intrcnt,
376368d2edcSThomas Moestl    sizeof(long) * INTRCNT_COUNT, "", "Interrupt Counts");
377368d2edcSThomas Moestl 
378368d2edcSThomas Moestl /*
379368d2edcSThomas Moestl  * We do not know the length in advance (in an MI fashion), so calculate things
380368d2edcSThomas Moestl  * at run-time.
381368d2edcSThomas Moestl  */
382368d2edcSThomas Moestl static int
383368d2edcSThomas Moestl sysctl_intrnames(SYSCTL_HANDLER_ARGS)
384368d2edcSThomas Moestl {
385368d2edcSThomas Moestl 	return sysctl_handle_opaque(oidp, intrnames, eintrnames - intrnames,
386368d2edcSThomas Moestl 	   req);
387368d2edcSThomas Moestl }
388368d2edcSThomas Moestl 
389368d2edcSThomas Moestl SYSCTL_PROC(_hw, OID_AUTO, intrnames, CTLTYPE_OPAQUE | CTLFLAG_RD, NULL, 0,
390368d2edcSThomas Moestl     sysctl_intrnames, "", "Interrupt Names");
391