| /*- |
| * Copyright (c) 1982, 1986, 1993 |
| * The Regents of the University of California. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * 4. Neither the name of the University nor the names of its contributors |
| * may be used to endorse or promote products derived from this software |
| * without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
| * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| * |
| * @(#)vmmeter.h 8.2 (Berkeley) 7/10/94 |
| * $FreeBSD$ |
| */ |
| |
| #ifndef _BSD_SYS_VMMETER_H_ |
| #define _BSD_SYS_VMMETER_H_ |
| |
| /* |
| * System wide statistics counters. |
| * Locking: |
| * a - locked by atomic operations |
| * c - constant after initialization |
| * f - locked by vm_page_queue_free_mtx |
| * p - locked by being in the PCPU and atomicity respect to interrupts |
| * q - locked by vm_page_queue_mtx |
| */ |
| struct vmmeter { |
| /* |
| * General system activity. |
| */ |
| u_int v_swtch; /* (p) context switches */ |
| u_int v_trap; /* (p) calls to trap */ |
| u_int v_syscall; /* (p) calls to syscall() */ |
| u_int v_intr; /* (p) device interrupts */ |
| u_int v_soft; /* (p) software interrupts */ |
| /* |
| * Virtual memory activity. |
| */ |
| u_int v_vm_faults; /* (p) address memory faults */ |
| u_int v_cow_faults; /* (p) copy-on-writes faults */ |
| u_int v_cow_optim; /* (p) optimized copy-on-writes faults */ |
| u_int v_zfod; /* (p) pages zero filled on demand */ |
| u_int v_ozfod; /* (p) optimized zero fill pages */ |
| u_int v_swapin; /* (p) swap pager pageins */ |
| u_int v_swapout; /* (p) swap pager pageouts */ |
| u_int v_swappgsin; /* (p) swap pager pages paged in */ |
| u_int v_swappgsout; /* (p) swap pager pages paged out */ |
| u_int v_vnodein; /* (p) vnode pager pageins */ |
| u_int v_vnodeout; /* (p) vnode pager pageouts */ |
| u_int v_vnodepgsin; /* (p) vnode_pager pages paged in */ |
| u_int v_vnodepgsout; /* (p) vnode pager pages paged out */ |
| u_int v_intrans; /* (p) intransit blocking page faults */ |
| u_int v_reactivated; /* (f) pages reactivated from free list */ |
| u_int v_pdwakeups; /* (f) times daemon has awaken from sleep */ |
| u_int v_pdpages; /* (q) pages analyzed by daemon */ |
| |
| u_int v_tcached; /* (q) total pages cached */ |
| u_int v_dfree; /* (q) pages freed by daemon */ |
| u_int v_pfree; /* (q) pages freed by exiting processes */ |
| u_int v_tfree; /* (p) total pages freed */ |
| /* |
| * Distribution of page usages. |
| */ |
| u_int v_page_size; /* (c) page size in bytes */ |
| u_int v_page_count; /* (c) total number of pages in system */ |
| u_int v_free_reserved; /* (c) pages reserved for deadlock */ |
| u_int v_free_target; /* (c) pages desired free */ |
| u_int v_free_min; /* (c) pages desired free */ |
| u_int v_free_count; /* (f) pages free */ |
| u_int v_wire_count; /* (a) pages wired down */ |
| u_int v_active_count; /* (q) pages active */ |
| u_int v_inactive_target; /* (c) pages desired inactive */ |
| u_int v_inactive_count; /* (q) pages inactive */ |
| u_int v_cache_count; /* (f) pages on cache queue */ |
| u_int v_cache_min; /* (c) min pages desired on cache queue */ |
| u_int v_cache_max; /* (c) max pages in cached obj */ |
| u_int v_pageout_free_min; /* (c) min pages reserved for kernel */ |
| u_int v_interrupt_free_min; /* (c) reserved pages for int code */ |
| u_int v_free_severe; /* (c) severe page depletion point */ |
| /* |
| * Fork/vfork/rfork activity. |
| */ |
| u_int v_forks; /* (p) fork() calls */ |
| u_int v_vforks; /* (p) vfork() calls */ |
| u_int v_rforks; /* (p) rfork() calls */ |
| u_int v_kthreads; /* (p) fork() calls by kernel */ |
| u_int v_forkpages; /* (p) VM pages affected by fork() */ |
| u_int v_vforkpages; /* (p) VM pages affected by vfork() */ |
| u_int v_rforkpages; /* (p) VM pages affected by rfork() */ |
| u_int v_kthreadpages; /* (p) VM pages affected by fork() by kernel */ |
| }; |
| #ifdef _FREEBSD_KERNEL |
| |
| extern struct vmmeter cnt; |
| |
| /* |
| * Return TRUE if we are under our severe low-free-pages threshold |
| * |
| * This routine is typically used at the user<->system interface to determine |
| * whether we need to block in order to avoid a low memory deadlock. |
| */ |
| |
| static __inline |
| int |
| vm_page_count_severe(void) |
| { |
| return (cnt.v_free_severe > (cnt.v_free_count + cnt.v_cache_count)); |
| } |
| |
| /* |
| * Return TRUE if we are under our minimum low-free-pages threshold. |
| * |
| * This routine is typically used within the system to determine whether |
| * we can execute potentially very expensive code in terms of memory. It |
| * is also used by the pageout daemon to calculate when to sleep, when |
| * to wake waiters up, and when (after making a pass) to become more |
| * desparate. |
| */ |
| |
| static __inline |
| int |
| vm_page_count_min(void) |
| { |
| return (cnt.v_free_min > (cnt.v_free_count + cnt.v_cache_count)); |
| } |
| |
| /* |
| * Return TRUE if we have not reached our free page target during |
| * free page recovery operations. |
| */ |
| |
| static __inline |
| int |
| vm_page_count_target(void) |
| { |
| return (cnt.v_free_target > (cnt.v_free_count + cnt.v_cache_count)); |
| } |
| |
| /* |
| * Return the number of pages we need to free-up or cache |
| * A positive number indicates that we do not have enough free pages. |
| */ |
| |
| static __inline |
| int |
| vm_paging_target(void) |
| { |
| return ( |
| (cnt.v_free_target + cnt.v_cache_min) - |
| (cnt.v_free_count + cnt.v_cache_count) |
| ); |
| } |
| |
| /* |
| * Returns TRUE if the pagedaemon needs to be woken up. |
| */ |
| |
| static __inline |
| int |
| vm_paging_needed(void) |
| { |
| return ( |
| (cnt.v_free_reserved + cnt.v_cache_min) > |
| (cnt.v_free_count + cnt.v_cache_count) |
| ); |
| } |
| |
| #endif |
| |
| /* systemwide totals computed every five seconds */ |
| struct vmtotal { |
| int16_t t_rq; /* length of the run queue */ |
| int16_t t_dw; /* jobs in ``disk wait'' (neg priority) */ |
| int16_t t_pw; /* jobs in page wait */ |
| int16_t t_sl; /* jobs sleeping in core */ |
| int16_t t_sw; /* swapped out runnable/short block jobs */ |
| int32_t t_vm; /* total virtual memory */ |
| int32_t t_avm; /* active virtual memory */ |
| int32_t t_rm; /* total real memory in use */ |
| int32_t t_arm; /* active real memory */ |
| int32_t t_vmshr; /* shared virtual memory */ |
| int32_t t_avmshr; /* active shared virtual memory */ |
| int32_t t_rmshr; /* shared real memory */ |
| int32_t t_armshr; /* active shared real memory */ |
| int32_t t_free; /* free memory pages */ |
| }; |
| |
| #endif |