vm_meter.c revision 164429
1139825Simp/*-
21541Srgrimes * Copyright (c) 1982, 1986, 1989, 1993
31541Srgrimes *	The Regents of the University of California.  All rights reserved.
41541Srgrimes *
51541Srgrimes * Redistribution and use in source and binary forms, with or without
61541Srgrimes * modification, are permitted provided that the following conditions
71541Srgrimes * are met:
81541Srgrimes * 1. Redistributions of source code must retain the above copyright
91541Srgrimes *    notice, this list of conditions and the following disclaimer.
101541Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
111541Srgrimes *    notice, this list of conditions and the following disclaimer in the
121541Srgrimes *    documentation and/or other materials provided with the distribution.
131541Srgrimes * 4. Neither the name of the University nor the names of its contributors
141541Srgrimes *    may be used to endorse or promote products derived from this software
151541Srgrimes *    without specific prior written permission.
161541Srgrimes *
171541Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
181541Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
191541Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
201541Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
211541Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
221541Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
231541Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
241541Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
251541Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
261541Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
271541Srgrimes * SUCH DAMAGE.
281541Srgrimes *
291541Srgrimes *	@(#)vm_meter.c	8.4 (Berkeley) 1/4/94
301541Srgrimes */
311541Srgrimes
32116226Sobrien#include <sys/cdefs.h>
33116226Sobrien__FBSDID("$FreeBSD: head/sys/vm/vm_meter.c 164429 2006-11-20 00:16:00Z ru $");
34116226Sobrien
351541Srgrimes#include <sys/param.h>
361541Srgrimes#include <sys/systm.h>
371541Srgrimes#include <sys/kernel.h>
3876166Smarkm#include <sys/lock.h>
3976166Smarkm#include <sys/mutex.h>
4076166Smarkm#include <sys/proc.h>
4134924Sbde#include <sys/resource.h>
4274927Sjhb#include <sys/sx.h>
4312662Sdg#include <sys/vmmeter.h>
4493823Sdillon#include <sys/smp.h>
4512662Sdg
461541Srgrimes#include <vm/vm.h>
4740794Speter#include <vm/vm_page.h>
4812726Sbde#include <vm/vm_extern.h>
4912662Sdg#include <vm/vm_param.h>
5012662Sdg#include <vm/pmap.h>
5112662Sdg#include <vm/vm_map.h>
5212662Sdg#include <vm/vm_object.h>
531541Srgrimes#include <sys/sysctl.h>
541541Srgrimes
559759Sbdestruct vmmeter cnt;
561541Srgrimes
5776778Sjhbint maxslp = MAXSLP;
581541Srgrimes
5962622SjhbSYSCTL_UINT(_vm, VM_V_FREE_MIN, v_free_min,
6012286Sphk	CTLFLAG_RW, &cnt.v_free_min, 0, "");
6162622SjhbSYSCTL_UINT(_vm, VM_V_FREE_TARGET, v_free_target,
6212286Sphk	CTLFLAG_RW, &cnt.v_free_target, 0, "");
6362622SjhbSYSCTL_UINT(_vm, VM_V_FREE_RESERVED, v_free_reserved,
6412286Sphk	CTLFLAG_RW, &cnt.v_free_reserved, 0, "");
6562622SjhbSYSCTL_UINT(_vm, VM_V_INACTIVE_TARGET, v_inactive_target,
6612286Sphk	CTLFLAG_RW, &cnt.v_inactive_target, 0, "");
6762622SjhbSYSCTL_UINT(_vm, VM_V_CACHE_MIN, v_cache_min,
6812286Sphk	CTLFLAG_RW, &cnt.v_cache_min, 0, "");
6962622SjhbSYSCTL_UINT(_vm, VM_V_CACHE_MAX, v_cache_max,
7012286Sphk	CTLFLAG_RW, &cnt.v_cache_max, 0, "");
7162622SjhbSYSCTL_UINT(_vm, VM_V_PAGEOUT_FREE_MIN, v_pageout_free_min,
7212286Sphk	CTLFLAG_RW, &cnt.v_pageout_free_min, 0, "");
7362622SjhbSYSCTL_UINT(_vm, OID_AUTO, v_free_severe,
7451337Sdillon	CTLFLAG_RW, &cnt.v_free_severe, 0, "");
7512286Sphk
76136404Speterstatic int
77136404Spetersysctl_vm_loadavg(SYSCTL_HANDLER_ARGS)
78136404Speter{
79136404Speter#ifdef SCTL_MASK32
80136404Speter	u_int32_t la[4];
811541Srgrimes
82136404Speter	if (req->flags & SCTL_MASK32) {
83136404Speter		la[0] = averunnable.ldavg[0];
84136404Speter		la[1] = averunnable.ldavg[1];
85136404Speter		la[2] = averunnable.ldavg[2];
86136404Speter		la[3] = averunnable.fscale;
87136404Speter		return SYSCTL_OUT(req, la, sizeof(la));
88136404Speter	} else
89136404Speter#endif
90136404Speter		return SYSCTL_OUT(req, &averunnable, sizeof(averunnable));
91136404Speter}
92136404SpeterSYSCTL_PROC(_vm, VM_LOADAVG, loadavg, CTLTYPE_STRUCT|CTLFLAG_RD,
93136404Speter    NULL, 0, sysctl_vm_loadavg, "S,loadavg", "Machine loadaverage history");
94136404Speter
9512286Sphkstatic int
9662573Sphkvmtotal(SYSCTL_HANDLER_ARGS)
971541Srgrimes{
9899072Sjulian/* XXXKSE almost completely broken */
9912286Sphk	struct proc *p;
10012286Sphk	struct vmtotal total, *totalp;
10112286Sphk	vm_map_entry_t entry;
10212286Sphk	vm_object_t object;
10312286Sphk	vm_map_t map;
1041541Srgrimes	int paging;
10599072Sjulian	struct thread *td;
106159054Stegge	struct vmspace *vm;
1071541Srgrimes
10812286Sphk	totalp = &total;
1091541Srgrimes	bzero(totalp, sizeof *totalp);
1101541Srgrimes	/*
1111541Srgrimes	 * Mark all objects as inactive.
1121541Srgrimes	 */
11379224Sdillon	GIANT_REQUIRED;
11495112Salc	mtx_lock(&vm_object_list_mtx);
115108551Salc	TAILQ_FOREACH(object, &vm_object_list, object_list) {
116124083Salc		if (!VM_OBJECT_TRYLOCK(object)) {
117124083Salc			/*
118124083Salc			 * Avoid a lock-order reversal.  Consequently,
119124083Salc			 * the reported number of active pages may be
120124083Salc			 * greater than the actual number.
121124083Salc			 */
122124083Salc			continue;
123124083Salc		}
12438517Sdfr		vm_object_clear_flag(object, OBJ_ACTIVE);
125113448Salc		VM_OBJECT_UNLOCK(object);
126108551Salc	}
12795112Salc	mtx_unlock(&vm_object_list_mtx);
1281541Srgrimes	/*
1291541Srgrimes	 * Calculate process statistics.
1301541Srgrimes	 */
13174927Sjhb	sx_slock(&allproc_lock);
13283366Sjulian	FOREACH_PROC_IN_SYSTEM(p) {
1331541Srgrimes		if (p->p_flag & P_SYSTEM)
1341541Srgrimes			continue;
13572200Sbmilekic		mtx_lock_spin(&sched_lock);
13699072Sjulian		switch (p->p_state) {
13799072Sjulian		case PRS_NEW:
13872200Sbmilekic			mtx_unlock_spin(&sched_lock);
1391541Srgrimes			continue;
1401541Srgrimes			break;
14199072Sjulian		default:
14299072Sjulian			FOREACH_THREAD_IN_PROC(p, td) {
143103216Sjulian				/* Need new statistics  XXX */
14499072Sjulian				switch (td->td_state) {
145103216Sjulian				case TDS_INHIBITED:
146104387Sjhb					if (TD_ON_LOCK(td) ||
147103216Sjulian					    (td->td_inhibitors ==
148103216Sjulian					    TDI_SWAPPED)) {
149103216Sjulian						totalp->t_sw++;
150103216Sjulian					} else if (TD_IS_SLEEPING(td) ||
151103216Sjulian					   TD_AWAITING_INTR(td) ||
152103216Sjulian					   TD_IS_SUSPENDED(td)) {
15399072Sjulian						if (td->td_priority <= PZERO)
15499072Sjulian							totalp->t_dw++;
155103216Sjulian						else
15699072Sjulian							totalp->t_sl++;
15799072Sjulian					}
15899072Sjulian					break;
1591541Srgrimes
160103216Sjulian				case TDS_CAN_RUN:
161103216Sjulian					totalp->t_sw++;
162103216Sjulian					break;
16399072Sjulian				case TDS_RUNQ:
16499072Sjulian				case TDS_RUNNING:
165103216Sjulian					totalp->t_rq++;
16699072Sjulian					continue;
16799072Sjulian				default:
16899072Sjulian					break;
16999072Sjulian				}
17071572Sjhb			}
1711541Srgrimes		}
17272200Sbmilekic		mtx_unlock_spin(&sched_lock);
1731541Srgrimes		/*
1741541Srgrimes		 * Note active objects.
1751541Srgrimes		 */
1761541Srgrimes		paging = 0;
177159054Stegge		vm = vmspace_acquire_ref(p);
178159054Stegge		if (vm == NULL)
179159054Stegge			continue;
180159054Stegge		map = &vm->vm_map;
181108585Salc		vm_map_lock_read(map);
182108585Salc		for (entry = map->header.next;
1835455Sdg		    entry != &map->header; entry = entry->next) {
18443748Sdillon			if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) ||
185108585Salc			    (object = entry->object.vm_object) == NULL)
1861541Srgrimes				continue;
187113448Salc			VM_OBJECT_LOCK(object);
188108585Salc			vm_object_set_flag(object, OBJ_ACTIVE);
189108585Salc			paging |= object->paging_in_progress;
190113448Salc			VM_OBJECT_UNLOCK(object);
1911541Srgrimes		}
192108585Salc		vm_map_unlock_read(map);
193159054Stegge		vmspace_free(vm);
1941541Srgrimes		if (paging)
1951541Srgrimes			totalp->t_pw++;
1961541Srgrimes	}
19774927Sjhb	sx_sunlock(&allproc_lock);
1981541Srgrimes	/*
1991541Srgrimes	 * Calculate object memory usage statistics.
2001541Srgrimes	 */
20195112Salc	mtx_lock(&vm_object_list_mtx);
20275523Salfred	TAILQ_FOREACH(object, &vm_object_list, object_list) {
20342957Sdillon		/*
204124083Salc		 * Perform unsynchronized reads on the object to avoid
205124083Salc		 * a lock-order reversal.  In this case, the lack of
206124083Salc		 * synchronization should not impair the accuracy of
207124083Salc		 * the reported statistics.
20842957Sdillon		 */
209108585Salc		if (object->type == OBJT_DEVICE) {
210124083Salc			/*
211124083Salc			 * Devices, like /dev/mem, will badly skew our totals.
212124083Salc			 */
21342957Sdillon			continue;
214108585Salc		}
215164429Sru		if (object->ref_count == 0) {
216164429Sru			/*
217164429Sru			 * Also skip unreferenced objects, including
218164429Sru			 * vnodes representing mounted file systems.
219164429Sru			 */
220164429Sru			continue;
221164429Sru		}
22218169Sdyson		totalp->t_vm += object->size;
2231541Srgrimes		totalp->t_rm += object->resident_page_count;
2241541Srgrimes		if (object->flags & OBJ_ACTIVE) {
22518169Sdyson			totalp->t_avm += object->size;
2261541Srgrimes			totalp->t_arm += object->resident_page_count;
2271541Srgrimes		}
22818169Sdyson		if (object->shadow_count > 1) {
2291541Srgrimes			/* shared object */
23018169Sdyson			totalp->t_vmshr += object->size;
2311541Srgrimes			totalp->t_rmshr += object->resident_page_count;
2321541Srgrimes			if (object->flags & OBJ_ACTIVE) {
23318169Sdyson				totalp->t_avmshr += object->size;
2341541Srgrimes				totalp->t_armshr += object->resident_page_count;
2351541Srgrimes			}
2361541Srgrimes		}
2371541Srgrimes	}
23895112Salc	mtx_unlock(&vm_object_list_mtx);
2395455Sdg	totalp->t_free = cnt.v_free_count + cnt.v_cache_count;
24012286Sphk	return (sysctl_handle_opaque(oidp, totalp, sizeof total, req));
2411541Srgrimes}
24212286Sphk
24393823Sdillon/*
24493823Sdillon * vcnt() -	accumulate statistics from all cpus and the global cnt
24593823Sdillon *		structure.
24693823Sdillon *
24793823Sdillon *	The vmmeter structure is now per-cpu as well as global.  Those
24893823Sdillon *	statistics which can be kept on a per-cpu basis (to avoid cache
24993823Sdillon *	stalls between cpus) can be moved to the per-cpu vmmeter.  Remaining
25093823Sdillon *	statistics, such as v_free_reserved, are left in the global
25193823Sdillon *	structure.
25293823Sdillon *
25393823Sdillon * (sysctl_oid *oidp, void *arg1, int arg2, struct sysctl_req *req)
25493823Sdillon */
25593823Sdillonstatic int
25693823Sdillonvcnt(SYSCTL_HANDLER_ARGS)
25793823Sdillon{
25893823Sdillon	int count = *(int *)arg1;
259144970Sjhb	int offset = (char *)arg1 - (char *)&cnt;
26093823Sdillon#ifdef SMP
26193823Sdillon	int i;
26293823Sdillon
26393823Sdillon	for (i = 0; i < mp_ncpus; ++i) {
26493823Sdillon		struct pcpu *pcpu = pcpu_find(i);
26593823Sdillon		count += *(int *)((char *)&pcpu->pc_cnt + offset);
26693823Sdillon	}
267108171Sdillon#else
268108171Sdillon	count += *(int *)((char *)PCPU_PTR(cnt) + offset);
26993823Sdillon#endif
270144970Sjhb	return (SYSCTL_OUT(req, &count, sizeof(int)));
27193823Sdillon}
27293823Sdillon
273109097SdillonSYSCTL_PROC(_vm, VM_TOTAL, vmtotal, CTLTYPE_OPAQUE|CTLFLAG_RD,
27446381Sbillf    0, sizeof(struct vmtotal), vmtotal, "S,vmtotal",
27546381Sbillf    "System virtual memory statistics");
276141696SphkSYSCTL_NODE(_vm, OID_AUTO, stats, CTLFLAG_RW, 0, "VM meter stats");
277141630Sphkstatic SYSCTL_NODE(_vm_stats, OID_AUTO, sys, CTLFLAG_RW, 0,
278141630Sphk	"VM meter sys stats");
279141630Sphkstatic SYSCTL_NODE(_vm_stats, OID_AUTO, vm, CTLFLAG_RW, 0,
280141630Sphk	"VM meter vm stats");
28140794SpeterSYSCTL_NODE(_vm_stats, OID_AUTO, misc, CTLFLAG_RW, 0, "VM meter misc stats");
28293823Sdillon
28393823SdillonSYSCTL_PROC(_vm_stats_sys, OID_AUTO, v_swtch, CTLTYPE_UINT|CTLFLAG_RD,
28493823Sdillon	&cnt.v_swtch, 0, vcnt, "IU", "Context switches");
28593823SdillonSYSCTL_PROC(_vm_stats_sys, OID_AUTO, v_trap, CTLTYPE_UINT|CTLFLAG_RD,
28693823Sdillon	&cnt.v_trap, 0, vcnt, "IU", "Traps");
28793823SdillonSYSCTL_PROC(_vm_stats_sys, OID_AUTO, v_syscall, CTLTYPE_UINT|CTLFLAG_RD,
28893823Sdillon	&cnt.v_syscall, 0, vcnt, "IU", "Syscalls");
28993823SdillonSYSCTL_PROC(_vm_stats_sys, OID_AUTO, v_intr, CTLTYPE_UINT|CTLFLAG_RD,
29093823Sdillon	&cnt.v_intr, 0, vcnt, "IU", "Hardware interrupts");
29193823SdillonSYSCTL_PROC(_vm_stats_sys, OID_AUTO, v_soft, CTLTYPE_UINT|CTLFLAG_RD,
29293823Sdillon	&cnt.v_soft, 0, vcnt, "IU", "Software interrupts");
29393823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vm_faults, CTLTYPE_UINT|CTLFLAG_RD,
29493823Sdillon	&cnt.v_vm_faults, 0, vcnt, "IU", "VM faults");
29593823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_cow_faults, CTLTYPE_UINT|CTLFLAG_RD,
29693823Sdillon	&cnt.v_cow_faults, 0, vcnt, "IU", "COW faults");
29793823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_cow_optim, CTLTYPE_UINT|CTLFLAG_RD,
29893823Sdillon	&cnt.v_cow_optim, 0, vcnt, "IU", "Optimized COW faults");
29993823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_zfod, CTLTYPE_UINT|CTLFLAG_RD,
30093823Sdillon	&cnt.v_zfod, 0, vcnt, "IU", "Zero fill");
30193823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_ozfod, CTLTYPE_UINT|CTLFLAG_RD,
30293823Sdillon	&cnt.v_ozfod, 0, vcnt, "IU", "Optimized zero fill");
30393823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_swapin, CTLTYPE_UINT|CTLFLAG_RD,
30493823Sdillon	&cnt.v_swapin, 0, vcnt, "IU", "Swapin operations");
30593823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_swapout, CTLTYPE_UINT|CTLFLAG_RD,
30693823Sdillon	&cnt.v_swapout, 0, vcnt, "IU", "Swapout operations");
30793823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_swappgsin, CTLTYPE_UINT|CTLFLAG_RD,
30893823Sdillon	&cnt.v_swappgsin, 0, vcnt, "IU", "Swapin pages");
30993823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_swappgsout, CTLTYPE_UINT|CTLFLAG_RD,
31093823Sdillon	&cnt.v_swappgsout, 0, vcnt, "IU", "Swapout pages");
31193823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vnodein, CTLTYPE_UINT|CTLFLAG_RD,
31293823Sdillon	&cnt.v_vnodein, 0, vcnt, "IU", "Vnodein operations");
31393823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vnodeout, CTLTYPE_UINT|CTLFLAG_RD,
31493823Sdillon	&cnt.v_vnodeout, 0, vcnt, "IU", "Vnodeout operations");
31593823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vnodepgsin, CTLTYPE_UINT|CTLFLAG_RD,
31693823Sdillon	&cnt.v_vnodepgsin, 0, vcnt, "IU", "Vnodein pages");
31793823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vnodepgsout, CTLTYPE_UINT|CTLFLAG_RD,
31893823Sdillon	&cnt.v_vnodepgsout, 0, vcnt, "IU", "Vnodeout pages");
31993823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_intrans, CTLTYPE_UINT|CTLFLAG_RD,
32093823Sdillon	&cnt.v_intrans, 0, vcnt, "IU", "In transit page blocking");
32193823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_reactivated, CTLTYPE_UINT|CTLFLAG_RD,
32293823Sdillon	&cnt.v_reactivated, 0, vcnt, "IU", "Reactivated pages");
32393823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_pdwakeups, CTLTYPE_UINT|CTLFLAG_RD,
32493823Sdillon	&cnt.v_pdwakeups, 0, vcnt, "IU", "Pagedaemon wakeups");
32593823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_pdpages, CTLTYPE_UINT|CTLFLAG_RD,
32693823Sdillon	&cnt.v_pdpages, 0, vcnt, "IU", "Pagedaemon page scans");
32793823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_dfree, CTLTYPE_UINT|CTLFLAG_RD,
32893823Sdillon	&cnt.v_dfree, 0, vcnt, "IU", "");
32993823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_pfree, CTLTYPE_UINT|CTLFLAG_RD,
33093823Sdillon	&cnt.v_pfree, 0, vcnt, "IU", "");
33193823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_tfree, CTLTYPE_UINT|CTLFLAG_RD,
33293823Sdillon	&cnt.v_tfree, 0, vcnt, "IU", "");
33393823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_page_size, CTLTYPE_UINT|CTLFLAG_RD,
33493823Sdillon	&cnt.v_page_size, 0, vcnt, "IU", "");
33593823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_page_count, CTLTYPE_UINT|CTLFLAG_RD,
33693823Sdillon	&cnt.v_page_count, 0, vcnt, "IU", "");
33793823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_free_reserved, CTLTYPE_UINT|CTLFLAG_RD,
33893823Sdillon	&cnt.v_free_reserved, 0, vcnt, "IU", "");
33993823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_free_target, CTLTYPE_UINT|CTLFLAG_RD,
34093823Sdillon	&cnt.v_free_target, 0, vcnt, "IU", "");
34193823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_free_min, CTLTYPE_UINT|CTLFLAG_RD,
34293823Sdillon	&cnt.v_free_min, 0, vcnt, "IU", "");
34393823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_free_count, CTLTYPE_UINT|CTLFLAG_RD,
34493823Sdillon	&cnt.v_free_count, 0, vcnt, "IU", "");
34593823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_wire_count, CTLTYPE_UINT|CTLFLAG_RD,
34693823Sdillon	&cnt.v_wire_count, 0, vcnt, "IU", "");
34793823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_active_count, CTLTYPE_UINT|CTLFLAG_RD,
34893823Sdillon	&cnt.v_active_count, 0, vcnt, "IU", "");
34993823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_inactive_target, CTLTYPE_UINT|CTLFLAG_RD,
35093823Sdillon	&cnt.v_inactive_target, 0, vcnt, "IU", "");
35193823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_inactive_count, CTLTYPE_UINT|CTLFLAG_RD,
35293823Sdillon	&cnt.v_inactive_count, 0, vcnt, "IU", "");
35393823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_cache_count, CTLTYPE_UINT|CTLFLAG_RD,
35493823Sdillon	&cnt.v_cache_count, 0, vcnt, "IU", "");
35593823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_cache_min, CTLTYPE_UINT|CTLFLAG_RD,
35693823Sdillon	&cnt.v_cache_min, 0, vcnt, "IU", "");
35793823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_cache_max, CTLTYPE_UINT|CTLFLAG_RD,
35893823Sdillon	&cnt.v_cache_max, 0, vcnt, "IU", "");
35993823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_pageout_free_min, CTLTYPE_UINT|CTLFLAG_RD,
36093823Sdillon	&cnt.v_pageout_free_min, 0, vcnt, "IU", "");
36193823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_interrupt_free_min, CTLTYPE_UINT|CTLFLAG_RD,
36293823Sdillon	&cnt.v_interrupt_free_min, 0, vcnt, "IU", "");
36393823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_forks, CTLTYPE_UINT|CTLFLAG_RD,
36493823Sdillon	&cnt.v_forks, 0, vcnt, "IU", "Number of fork() calls");
36593823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vforks, CTLTYPE_UINT|CTLFLAG_RD,
36693823Sdillon	&cnt.v_vforks, 0, vcnt, "IU", "Number of vfork() calls");
36793823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_rforks, CTLTYPE_UINT|CTLFLAG_RD,
36893823Sdillon	&cnt.v_rforks, 0, vcnt, "IU", "Number of rfork() calls");
36993823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_kthreads, CTLTYPE_UINT|CTLFLAG_RD,
37093823Sdillon	&cnt.v_kthreads, 0, vcnt, "IU", "Number of fork() calls by kernel");
37193823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_forkpages, CTLTYPE_UINT|CTLFLAG_RD,
37293823Sdillon	&cnt.v_forkpages, 0, vcnt, "IU", "VM pages affected by fork()");
37393823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vforkpages, CTLTYPE_UINT|CTLFLAG_RD,
37493823Sdillon	&cnt.v_vforkpages, 0, vcnt, "IU", "VM pages affected by vfork()");
37593823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_rforkpages, CTLTYPE_UINT|CTLFLAG_RD,
37693823Sdillon	&cnt.v_rforkpages, 0, vcnt, "IU", "VM pages affected by rfork()");
37793823SdillonSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_kthreadpages, CTLTYPE_UINT|CTLFLAG_RD,
37893823Sdillon	&cnt.v_kthreadpages, 0, vcnt, "IU", "VM pages affected by fork() by kernel");
37993823Sdillon
38040794SpeterSYSCTL_INT(_vm_stats_misc, OID_AUTO,
38140794Speter	zero_page_count, CTLFLAG_RD, &vm_page_zero_count, 0, "");
38240794Speter#if 0
38340794SpeterSYSCTL_INT(_vm_stats_misc, OID_AUTO,
38440794Speter	page_mask, CTLFLAG_RD, &page_mask, 0, "");
38540794SpeterSYSCTL_INT(_vm_stats_misc, OID_AUTO,
38640794Speter	page_shift, CTLFLAG_RD, &page_shift, 0, "");
38740794SpeterSYSCTL_INT(_vm_stats_misc, OID_AUTO,
38840794Speter	first_page, CTLFLAG_RD, &first_page, 0, "");
38940794SpeterSYSCTL_INT(_vm_stats_misc, OID_AUTO,
39040794Speter	last_page, CTLFLAG_RD, &last_page, 0, "");
39140794Speter#endif
392