vm_meter.c revision 164437
175374Sbp/*-
275374Sbp * Copyright (c) 1982, 1986, 1989, 1993
375374Sbp *	The Regents of the University of California.  All rights reserved.
475374Sbp *
5124087Stjr * Redistribution and use in source and binary forms, with or without
6124087Stjr * modification, are permitted provided that the following conditions
7124087Stjr * are met:
875374Sbp * 1. Redistributions of source code must retain the above copyright
975374Sbp *    notice, this list of conditions and the following disclaimer.
1075374Sbp * 2. Redistributions in binary form must reproduce the above copyright
1175374Sbp *    notice, this list of conditions and the following disclaimer in the
1275374Sbp *    documentation and/or other materials provided with the distribution.
1375374Sbp * 4. Neither the name of the University nor the names of its contributors
1475374Sbp *    may be used to endorse or promote products derived from this software
1575374Sbp *    without specific prior written permission.
1675374Sbp *
1775374Sbp * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1875374Sbp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1975374Sbp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2075374Sbp * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2175374Sbp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2275374Sbp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2375374Sbp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2475374Sbp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2575374Sbp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2675374Sbp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2775374Sbp * SUCH DAMAGE.
2875374Sbp *
2975374Sbp *	@(#)vm_meter.c	8.4 (Berkeley) 1/4/94
3075374Sbp */
3175374Sbp
3275374Sbp#include <sys/cdefs.h>
3375374Sbp__FBSDID("$FreeBSD: head/sys/vm/vm_meter.c 164437 2006-11-20 08:33:55Z ru $");
3475374Sbp
35116189Sobrien#include <sys/param.h>
36116189Sobrien#include <sys/systm.h>
37116189Sobrien#include <sys/kernel.h>
38116189Sobrien#include <sys/lock.h>
3975374Sbp#include <sys/mutex.h>
4075374Sbp#include <sys/proc.h>
4175374Sbp#include <sys/resource.h>
4275374Sbp#include <sys/sx.h>
4375374Sbp#include <sys/vmmeter.h>
4475374Sbp#include <sys/smp.h>
4575374Sbp
4675374Sbp#include <vm/vm.h>
4775374Sbp#include <vm/vm_page.h>
4875374Sbp#include <vm/vm_extern.h>
49124087Stjr#include <vm/vm_param.h>
50124087Stjr#include <vm/pmap.h>
51124087Stjr#include <vm/vm_map.h>
5275374Sbp#include <vm/vm_object.h>
53124087Stjr#include <sys/sysctl.h>
5475374Sbp
5575374Sbpstruct vmmeter cnt;
5675374Sbp
5775374Sbpint maxslp = MAXSLP;
5875374Sbp
59124087StjrSYSCTL_UINT(_vm, VM_V_FREE_MIN, v_free_min,
6075374Sbp	CTLFLAG_RW, &cnt.v_free_min, 0, "");
6175374SbpSYSCTL_UINT(_vm, VM_V_FREE_TARGET, v_free_target,
6275374Sbp	CTLFLAG_RW, &cnt.v_free_target, 0, "");
6375374SbpSYSCTL_UINT(_vm, VM_V_FREE_RESERVED, v_free_reserved,
6475374Sbp	CTLFLAG_RW, &cnt.v_free_reserved, 0, "");
6575374SbpSYSCTL_UINT(_vm, VM_V_INACTIVE_TARGET, v_inactive_target,
6675374Sbp	CTLFLAG_RW, &cnt.v_inactive_target, 0, "");
6775374SbpSYSCTL_UINT(_vm, VM_V_CACHE_MIN, v_cache_min,
6875374Sbp	CTLFLAG_RW, &cnt.v_cache_min, 0, "");
6975374SbpSYSCTL_UINT(_vm, VM_V_CACHE_MAX, v_cache_max,
7075374Sbp	CTLFLAG_RW, &cnt.v_cache_max, 0, "");
7175374SbpSYSCTL_UINT(_vm, VM_V_PAGEOUT_FREE_MIN, v_pageout_free_min,
7275374Sbp	CTLFLAG_RW, &cnt.v_pageout_free_min, 0, "");
7375374SbpSYSCTL_UINT(_vm, OID_AUTO, v_free_severe,
7475374Sbp	CTLFLAG_RW, &cnt.v_free_severe, 0, "");
7575374Sbp
7675374Sbpstatic int
7775374Sbpsysctl_vm_loadavg(SYSCTL_HANDLER_ARGS)
7875374Sbp{
7975374Sbp#ifdef SCTL_MASK32
8075374Sbp	u_int32_t la[4];
8175374Sbp
8275374Sbp	if (req->flags & SCTL_MASK32) {
8375374Sbp		la[0] = averunnable.ldavg[0];
8475374Sbp		la[1] = averunnable.ldavg[1];
85111119Simp		la[2] = averunnable.ldavg[2];
8678064Sume		la[3] = averunnable.fscale;
8778064Sume		return SYSCTL_OUT(req, la, sizeof(la));
8875374Sbp	} else
8975374Sbp#endif
9075374Sbp		return SYSCTL_OUT(req, &averunnable, sizeof(averunnable));
9175374Sbp}
9275374SbpSYSCTL_PROC(_vm, VM_LOADAVG, loadavg, CTLTYPE_STRUCT|CTLFLAG_RD,
9375374Sbp    NULL, 0, sysctl_vm_loadavg, "S,loadavg", "Machine loadaverage history");
9475374Sbp
9575374Sbpstatic int
9675374Sbpvmtotal(SYSCTL_HANDLER_ARGS)
9775374Sbp{
9875374Sbp/* XXXKSE almost completely broken */
99111119Simp	struct proc *p;
10075374Sbp	struct vmtotal total;
10175374Sbp	vm_map_entry_t entry;
10275374Sbp	vm_object_t object;
10375374Sbp	vm_map_t map;
10475374Sbp	int paging;
10575374Sbp	struct thread *td;
10675374Sbp	struct vmspace *vm;
10775374Sbp
10875374Sbp	bzero(&total, sizeof(total));
10975374Sbp	/*
11075374Sbp	 * Mark all objects as inactive.
11175374Sbp	 */
11275374Sbp	GIANT_REQUIRED;
11375374Sbp	mtx_lock(&vm_object_list_mtx);
11475374Sbp	TAILQ_FOREACH(object, &vm_object_list, object_list) {
11575374Sbp		if (!VM_OBJECT_TRYLOCK(object)) {
11675374Sbp			/*
11775374Sbp			 * Avoid a lock-order reversal.  Consequently,
11875374Sbp			 * the reported number of active pages may be
11975374Sbp			 * greater than the actual number.
12075374Sbp			 */
12175374Sbp			continue;
12275374Sbp		}
12375374Sbp		vm_object_clear_flag(object, OBJ_ACTIVE);
12475374Sbp		VM_OBJECT_UNLOCK(object);
12575374Sbp	}
12675374Sbp	mtx_unlock(&vm_object_list_mtx);
12775374Sbp	/*
12875374Sbp	 * Calculate process statistics.
12975374Sbp	 */
13075374Sbp	sx_slock(&allproc_lock);
13175374Sbp	FOREACH_PROC_IN_SYSTEM(p) {
132111119Simp		if (p->p_flag & P_SYSTEM)
13375374Sbp			continue;
13475374Sbp		mtx_lock_spin(&sched_lock);
13575374Sbp		switch (p->p_state) {
13675374Sbp		case PRS_NEW:
137111119Simp			mtx_unlock_spin(&sched_lock);
13875374Sbp			continue;
13975374Sbp			break;
14075374Sbp		default:
14175374Sbp			FOREACH_THREAD_IN_PROC(p, td) {
14275374Sbp				/* Need new statistics  XXX */
14375374Sbp				switch (td->td_state) {
14475374Sbp				case TDS_INHIBITED:
14575374Sbp					if (TD_ON_LOCK(td) ||
14675374Sbp					    (td->td_inhibitors ==
14775374Sbp					    TDI_SWAPPED)) {
14875374Sbp						total.t_sw++;
14975374Sbp					} else if (TD_IS_SLEEPING(td) ||
15075374Sbp					   TD_AWAITING_INTR(td) ||
15175374Sbp					   TD_IS_SUSPENDED(td)) {
15275374Sbp						if (td->td_priority <= PZERO)
15375374Sbp							total.t_dw++;
15475374Sbp						else
15575374Sbp							total.t_sl++;
156124087Stjr					}
157124087Stjr					break;
158124087Stjr
159124087Stjr				case TDS_CAN_RUN:
160124087Stjr					total.t_sw++;
161124087Stjr					break;
162124087Stjr				case TDS_RUNQ:
163124087Stjr				case TDS_RUNNING:
164124087Stjr					total.t_rq++;
165124087Stjr					continue;
166124087Stjr				default:
167124087Stjr					break;
168124087Stjr				}
169124087Stjr			}
170124087Stjr		}
171124087Stjr		mtx_unlock_spin(&sched_lock);
172124087Stjr		/*
173124087Stjr		 * Note active objects.
174124087Stjr		 */
175124087Stjr		paging = 0;
176124087Stjr		vm = vmspace_acquire_ref(p);
177124087Stjr		if (vm == NULL)
178124087Stjr			continue;
179124087Stjr		map = &vm->vm_map;
180124087Stjr		vm_map_lock_read(map);
181124087Stjr		for (entry = map->header.next;
182124087Stjr		    entry != &map->header; entry = entry->next) {
183124087Stjr			if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) ||
184124087Stjr			    (object = entry->object.vm_object) == NULL)
185124087Stjr				continue;
186124087Stjr			VM_OBJECT_LOCK(object);
187124087Stjr			vm_object_set_flag(object, OBJ_ACTIVE);
188124087Stjr			paging |= object->paging_in_progress;
189124087Stjr			VM_OBJECT_UNLOCK(object);
190124087Stjr		}
191124087Stjr		vm_map_unlock_read(map);
192124087Stjr		vmspace_free(vm);
193124087Stjr		if (paging)
194124087Stjr			total.t_pw++;
195124087Stjr	}
196124087Stjr	sx_sunlock(&allproc_lock);
197124087Stjr	/*
198124087Stjr	 * Calculate object memory usage statistics.
199124087Stjr	 */
200124087Stjr	mtx_lock(&vm_object_list_mtx);
201124087Stjr	TAILQ_FOREACH(object, &vm_object_list, object_list) {
202124087Stjr		/*
203124087Stjr		 * Perform unsynchronized reads on the object to avoid
204124087Stjr		 * a lock-order reversal.  In this case, the lack of
205124087Stjr		 * synchronization should not impair the accuracy of
206124087Stjr		 * the reported statistics.
207124087Stjr		 */
208124087Stjr		if (object->type == OBJT_DEVICE) {
209124087Stjr			/*
210124087Stjr			 * Devices, like /dev/mem, will badly skew our totals.
211124087Stjr			 */
212124087Stjr			continue;
213124087Stjr		}
214124087Stjr		if (object->ref_count == 0) {
215124087Stjr			/*
216124087Stjr			 * Also skip unreferenced objects, including
217124087Stjr			 * vnodes representing mounted file systems.
218124087Stjr			 */
219124087Stjr			continue;
220124087Stjr		}
221124087Stjr		total.t_vm += object->size;
222124087Stjr		total.t_rm += object->resident_page_count;
223124087Stjr		if (object->flags & OBJ_ACTIVE) {
224124087Stjr			total.t_avm += object->size;
225124087Stjr			total.t_arm += object->resident_page_count;
226124087Stjr		}
227124087Stjr		if (object->shadow_count > 1) {
228124087Stjr			/* shared object */
229124087Stjr			total.t_vmshr += object->size;
230124087Stjr			total.t_rmshr += object->resident_page_count;
231124087Stjr			if (object->flags & OBJ_ACTIVE) {
232124087Stjr				total.t_avmshr += object->size;
233124087Stjr				total.t_armshr += object->resident_page_count;
234124087Stjr			}
235124087Stjr		}
236124087Stjr	}
237124087Stjr	mtx_unlock(&vm_object_list_mtx);
238124087Stjr	total.t_free = cnt.v_free_count + cnt.v_cache_count;
239124087Stjr	return (sysctl_handle_opaque(oidp, &total, sizeof(total), req));
240124087Stjr}
241124087Stjr
242124087Stjr/*
243124087Stjr * vcnt() -	accumulate statistics from all cpus and the global cnt
244124087Stjr *		structure.
245124087Stjr *
246124087Stjr *	The vmmeter structure is now per-cpu as well as global.  Those
247124087Stjr *	statistics which can be kept on a per-cpu basis (to avoid cache
248124087Stjr *	stalls between cpus) can be moved to the per-cpu vmmeter.  Remaining
249124087Stjr *	statistics, such as v_free_reserved, are left in the global
250124087Stjr *	structure.
251124087Stjr *
252124087Stjr * (sysctl_oid *oidp, void *arg1, int arg2, struct sysctl_req *req)
253124087Stjr */
254124087Stjrstatic int
255124087Stjrvcnt(SYSCTL_HANDLER_ARGS)
256124087Stjr{
257124087Stjr	int count = *(int *)arg1;
258124087Stjr	int offset = (char *)arg1 - (char *)&cnt;
259124087Stjr#ifdef SMP
260124087Stjr	int i;
261124087Stjr
262124087Stjr	for (i = 0; i < mp_ncpus; ++i) {
263124087Stjr		struct pcpu *pcpu = pcpu_find(i);
264124087Stjr		count += *(int *)((char *)&pcpu->pc_cnt + offset);
265124087Stjr	}
266124087Stjr#else
267124087Stjr	count += *(int *)((char *)PCPU_PTR(cnt) + offset);
268124087Stjr#endif
269124087Stjr	return (SYSCTL_OUT(req, &count, sizeof(int)));
270124087Stjr}
271124087Stjr
272124087StjrSYSCTL_PROC(_vm, VM_TOTAL, vmtotal, CTLTYPE_OPAQUE|CTLFLAG_RD,
273124087Stjr    0, sizeof(struct vmtotal), vmtotal, "S,vmtotal",
274124087Stjr    "System virtual memory statistics");
275124087StjrSYSCTL_NODE(_vm, OID_AUTO, stats, CTLFLAG_RW, 0, "VM meter stats");
276124087Stjrstatic SYSCTL_NODE(_vm_stats, OID_AUTO, sys, CTLFLAG_RW, 0,
277124087Stjr	"VM meter sys stats");
278124087Stjrstatic SYSCTL_NODE(_vm_stats, OID_AUTO, vm, CTLFLAG_RW, 0,
279124087Stjr	"VM meter vm stats");
280124087StjrSYSCTL_NODE(_vm_stats, OID_AUTO, misc, CTLFLAG_RW, 0, "VM meter misc stats");
281124087Stjr
282124087StjrSYSCTL_PROC(_vm_stats_sys, OID_AUTO, v_swtch, CTLTYPE_UINT|CTLFLAG_RD,
283124087Stjr	&cnt.v_swtch, 0, vcnt, "IU", "Context switches");
284124087StjrSYSCTL_PROC(_vm_stats_sys, OID_AUTO, v_trap, CTLTYPE_UINT|CTLFLAG_RD,
285124087Stjr	&cnt.v_trap, 0, vcnt, "IU", "Traps");
286124087StjrSYSCTL_PROC(_vm_stats_sys, OID_AUTO, v_syscall, CTLTYPE_UINT|CTLFLAG_RD,
287124087Stjr	&cnt.v_syscall, 0, vcnt, "IU", "Syscalls");
288124087StjrSYSCTL_PROC(_vm_stats_sys, OID_AUTO, v_intr, CTLTYPE_UINT|CTLFLAG_RD,
289124087Stjr	&cnt.v_intr, 0, vcnt, "IU", "Hardware interrupts");
290124087StjrSYSCTL_PROC(_vm_stats_sys, OID_AUTO, v_soft, CTLTYPE_UINT|CTLFLAG_RD,
291124087Stjr	&cnt.v_soft, 0, vcnt, "IU", "Software interrupts");
292124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vm_faults, CTLTYPE_UINT|CTLFLAG_RD,
293124087Stjr	&cnt.v_vm_faults, 0, vcnt, "IU", "VM faults");
294124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_cow_faults, CTLTYPE_UINT|CTLFLAG_RD,
295124087Stjr	&cnt.v_cow_faults, 0, vcnt, "IU", "COW faults");
296124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_cow_optim, CTLTYPE_UINT|CTLFLAG_RD,
297124087Stjr	&cnt.v_cow_optim, 0, vcnt, "IU", "Optimized COW faults");
298124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_zfod, CTLTYPE_UINT|CTLFLAG_RD,
299124087Stjr	&cnt.v_zfod, 0, vcnt, "IU", "Zero fill");
300124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_ozfod, CTLTYPE_UINT|CTLFLAG_RD,
301124087Stjr	&cnt.v_ozfod, 0, vcnt, "IU", "Optimized zero fill");
302124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_swapin, CTLTYPE_UINT|CTLFLAG_RD,
303124087Stjr	&cnt.v_swapin, 0, vcnt, "IU", "Swapin operations");
304124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_swapout, CTLTYPE_UINT|CTLFLAG_RD,
305124087Stjr	&cnt.v_swapout, 0, vcnt, "IU", "Swapout operations");
306124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_swappgsin, CTLTYPE_UINT|CTLFLAG_RD,
307124087Stjr	&cnt.v_swappgsin, 0, vcnt, "IU", "Swapin pages");
308124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_swappgsout, CTLTYPE_UINT|CTLFLAG_RD,
309124087Stjr	&cnt.v_swappgsout, 0, vcnt, "IU", "Swapout pages");
310124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vnodein, CTLTYPE_UINT|CTLFLAG_RD,
311124087Stjr	&cnt.v_vnodein, 0, vcnt, "IU", "Vnodein operations");
312124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vnodeout, CTLTYPE_UINT|CTLFLAG_RD,
313124087Stjr	&cnt.v_vnodeout, 0, vcnt, "IU", "Vnodeout operations");
314124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vnodepgsin, CTLTYPE_UINT|CTLFLAG_RD,
315124087Stjr	&cnt.v_vnodepgsin, 0, vcnt, "IU", "Vnodein pages");
316124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vnodepgsout, CTLTYPE_UINT|CTLFLAG_RD,
317124087Stjr	&cnt.v_vnodepgsout, 0, vcnt, "IU", "Vnodeout pages");
318124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_intrans, CTLTYPE_UINT|CTLFLAG_RD,
319124087Stjr	&cnt.v_intrans, 0, vcnt, "IU", "In transit page blocking");
320124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_reactivated, CTLTYPE_UINT|CTLFLAG_RD,
321124087Stjr	&cnt.v_reactivated, 0, vcnt, "IU", "Reactivated pages");
322124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_pdwakeups, CTLTYPE_UINT|CTLFLAG_RD,
323124087Stjr	&cnt.v_pdwakeups, 0, vcnt, "IU", "Pagedaemon wakeups");
324124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_pdpages, CTLTYPE_UINT|CTLFLAG_RD,
325124087Stjr	&cnt.v_pdpages, 0, vcnt, "IU", "Pagedaemon page scans");
326124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_dfree, CTLTYPE_UINT|CTLFLAG_RD,
327124087Stjr	&cnt.v_dfree, 0, vcnt, "IU", "");
328124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_pfree, CTLTYPE_UINT|CTLFLAG_RD,
329124087Stjr	&cnt.v_pfree, 0, vcnt, "IU", "");
330124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_tfree, CTLTYPE_UINT|CTLFLAG_RD,
331124087Stjr	&cnt.v_tfree, 0, vcnt, "IU", "");
332124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_page_size, CTLTYPE_UINT|CTLFLAG_RD,
333124087Stjr	&cnt.v_page_size, 0, vcnt, "IU", "");
334124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_page_count, CTLTYPE_UINT|CTLFLAG_RD,
335124087Stjr	&cnt.v_page_count, 0, vcnt, "IU", "");
336124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_free_reserved, CTLTYPE_UINT|CTLFLAG_RD,
337124087Stjr	&cnt.v_free_reserved, 0, vcnt, "IU", "");
338124087StjrSYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_free_target, CTLTYPE_UINT|CTLFLAG_RD,
339124087Stjr	&cnt.v_free_target, 0, vcnt, "IU", "");
340SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_free_min, CTLTYPE_UINT|CTLFLAG_RD,
341	&cnt.v_free_min, 0, vcnt, "IU", "");
342SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_free_count, CTLTYPE_UINT|CTLFLAG_RD,
343	&cnt.v_free_count, 0, vcnt, "IU", "");
344SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_wire_count, CTLTYPE_UINT|CTLFLAG_RD,
345	&cnt.v_wire_count, 0, vcnt, "IU", "");
346SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_active_count, CTLTYPE_UINT|CTLFLAG_RD,
347	&cnt.v_active_count, 0, vcnt, "IU", "");
348SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_inactive_target, CTLTYPE_UINT|CTLFLAG_RD,
349	&cnt.v_inactive_target, 0, vcnt, "IU", "");
350SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_inactive_count, CTLTYPE_UINT|CTLFLAG_RD,
351	&cnt.v_inactive_count, 0, vcnt, "IU", "");
352SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_cache_count, CTLTYPE_UINT|CTLFLAG_RD,
353	&cnt.v_cache_count, 0, vcnt, "IU", "");
354SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_cache_min, CTLTYPE_UINT|CTLFLAG_RD,
355	&cnt.v_cache_min, 0, vcnt, "IU", "");
356SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_cache_max, CTLTYPE_UINT|CTLFLAG_RD,
357	&cnt.v_cache_max, 0, vcnt, "IU", "");
358SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_pageout_free_min, CTLTYPE_UINT|CTLFLAG_RD,
359	&cnt.v_pageout_free_min, 0, vcnt, "IU", "");
360SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_interrupt_free_min, CTLTYPE_UINT|CTLFLAG_RD,
361	&cnt.v_interrupt_free_min, 0, vcnt, "IU", "");
362SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_forks, CTLTYPE_UINT|CTLFLAG_RD,
363	&cnt.v_forks, 0, vcnt, "IU", "Number of fork() calls");
364SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vforks, CTLTYPE_UINT|CTLFLAG_RD,
365	&cnt.v_vforks, 0, vcnt, "IU", "Number of vfork() calls");
366SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_rforks, CTLTYPE_UINT|CTLFLAG_RD,
367	&cnt.v_rforks, 0, vcnt, "IU", "Number of rfork() calls");
368SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_kthreads, CTLTYPE_UINT|CTLFLAG_RD,
369	&cnt.v_kthreads, 0, vcnt, "IU", "Number of fork() calls by kernel");
370SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_forkpages, CTLTYPE_UINT|CTLFLAG_RD,
371	&cnt.v_forkpages, 0, vcnt, "IU", "VM pages affected by fork()");
372SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_vforkpages, CTLTYPE_UINT|CTLFLAG_RD,
373	&cnt.v_vforkpages, 0, vcnt, "IU", "VM pages affected by vfork()");
374SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_rforkpages, CTLTYPE_UINT|CTLFLAG_RD,
375	&cnt.v_rforkpages, 0, vcnt, "IU", "VM pages affected by rfork()");
376SYSCTL_PROC(_vm_stats_vm, OID_AUTO, v_kthreadpages, CTLTYPE_UINT|CTLFLAG_RD,
377	&cnt.v_kthreadpages, 0, vcnt, "IU", "VM pages affected by fork() by kernel");
378
379SYSCTL_INT(_vm_stats_misc, OID_AUTO,
380	zero_page_count, CTLFLAG_RD, &vm_page_zero_count, 0, "");
381#if 0
382SYSCTL_INT(_vm_stats_misc, OID_AUTO,
383	page_mask, CTLFLAG_RD, &page_mask, 0, "");
384SYSCTL_INT(_vm_stats_misc, OID_AUTO,
385	page_shift, CTLFLAG_RD, &page_shift, 0, "");
386SYSCTL_INT(_vm_stats_misc, OID_AUTO,
387	first_page, CTLFLAG_RD, &first_page, 0, "");
388SYSCTL_INT(_vm_stats_misc, OID_AUTO,
389	last_page, CTLFLAG_RD, &last_page, 0, "");
390#endif
391