vm_meter.c (5464) | vm_meter.c (9507) |
---|---|
1/* 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)vm_meter.c 8.4 (Berkeley) 1/4/94 | 1/* 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)vm_meter.c 8.4 (Berkeley) 1/4/94 |
34 * $Id: vm_meter.c,v 1.5 1995/01/09 16:05:47 davidg Exp $ | 34 * $Id: vm_meter.c,v 1.6 1995/01/10 07:32:47 davidg Exp $ |
35 */ 36 37#include <sys/param.h> 38#include <sys/proc.h> 39#include <sys/systm.h> 40#include <sys/kernel.h> 41#include <vm/vm.h> 42#include <sys/sysctl.h> 43 44struct loadavg averunnable; /* load average, of runnable procs */ 45 46int maxslp = MAXSLP; 47 | 35 */ 36 37#include <sys/param.h> 38#include <sys/proc.h> 39#include <sys/systm.h> 40#include <sys/kernel.h> 41#include <vm/vm.h> 42#include <sys/sysctl.h> 43 44struct loadavg averunnable; /* load average, of runnable procs */ 45 46int maxslp = MAXSLP; 47 |
48void 49vmmeter() 50{ 51 52 if (time.tv_sec % 5 == 0) 53 loadav(&averunnable); 54 if (proc0.p_slptime > maxslp / 2) 55 wakeup((caddr_t) &proc0); 56} 57 | |
58/* 59 * Constants for averages over 1, 5, and 15 minutes 60 * when sampling at 5 second intervals. 61 */ 62fixpt_t cexp[3] = { 63 0.9200444146293232 * FSCALE, /* exp(-1/12) */ 64 0.9834714538216174 * FSCALE, /* exp(-1/60) */ 65 0.9944598480048967 * FSCALE, /* exp(-1/180) */ 66}; 67 68/* 69 * Compute a tenex style load average of a quantity on 70 * 1, 5 and 15 minute intervals. 71 */ | 48/* 49 * Constants for averages over 1, 5, and 15 minutes 50 * when sampling at 5 second intervals. 51 */ 52fixpt_t cexp[3] = { 53 0.9200444146293232 * FSCALE, /* exp(-1/12) */ 54 0.9834714538216174 * FSCALE, /* exp(-1/60) */ 55 0.9944598480048967 * FSCALE, /* exp(-1/180) */ 56}; 57 58/* 59 * Compute a tenex style load average of a quantity on 60 * 1, 5 and 15 minute intervals. 61 */ |
72void | 62static void |
73loadav(avg) 74 register struct loadavg *avg; 75{ 76 register int i, nrun; 77 register struct proc *p; 78 79 for (nrun = 0, p = (struct proc *) allproc; p != NULL; p = p->p_next) { 80 switch (p->p_stat) { --- 6 unchanged lines hidden (view full) --- 87 nrun++; 88 } 89 } 90 for (i = 0; i < 3; i++) 91 avg->ldavg[i] = (cexp[i] * avg->ldavg[i] + 92 nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT; 93} 94 | 63loadav(avg) 64 register struct loadavg *avg; 65{ 66 register int i, nrun; 67 register struct proc *p; 68 69 for (nrun = 0, p = (struct proc *) allproc; p != NULL; p = p->p_next) { 70 switch (p->p_stat) { --- 6 unchanged lines hidden (view full) --- 77 nrun++; 78 } 79 } 80 for (i = 0; i < 3; i++) 81 avg->ldavg[i] = (cexp[i] * avg->ldavg[i] + 82 nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT; 83} 84 |
85void 86vmmeter() 87{ 88 89 if (time.tv_sec % 5 == 0) 90 loadav(&averunnable); 91 if (proc0.p_slptime > maxslp / 2) 92 wakeup(&proc0); 93} 94 |
|
95/* 96 * Attributes associated with virtual memory. 97 */ 98int 99vm_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) 100 int *name; 101 u_int namelen; 102 void *oldp; --- 51 unchanged lines hidden (view full) --- 154 register vm_object_t object; 155 register vm_map_t map; 156 int paging; 157 158 bzero(totalp, sizeof *totalp); 159 /* 160 * Mark all objects as inactive. 161 */ | 95/* 96 * Attributes associated with virtual memory. 97 */ 98int 99vm_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) 100 int *name; 101 u_int namelen; 102 void *oldp; --- 51 unchanged lines hidden (view full) --- 154 register vm_object_t object; 155 register vm_map_t map; 156 int paging; 157 158 bzero(totalp, sizeof *totalp); 159 /* 160 * Mark all objects as inactive. 161 */ |
162 simple_lock(&vm_object_list_lock); | |
163 for (object = vm_object_list.tqh_first; 164 object != NULL; 165 object = object->object_list.tqe_next) 166 object->flags &= ~OBJ_ACTIVE; | 162 for (object = vm_object_list.tqh_first; 163 object != NULL; 164 object = object->object_list.tqe_next) 165 object->flags &= ~OBJ_ACTIVE; |
167 simple_unlock(&vm_object_list_lock); | |
168 /* 169 * Calculate process statistics. 170 */ 171 for (p = (struct proc *) allproc; p != NULL; p = p->p_next) { 172 if (p->p_flag & P_SYSTEM) 173 continue; 174 switch (p->p_stat) { 175 case 0: --- 35 unchanged lines hidden (view full) --- 211 paging |= entry->object.vm_object->paging_in_progress; 212 } 213 if (paging) 214 totalp->t_pw++; 215 } 216 /* 217 * Calculate object memory usage statistics. 218 */ | 166 /* 167 * Calculate process statistics. 168 */ 169 for (p = (struct proc *) allproc; p != NULL; p = p->p_next) { 170 if (p->p_flag & P_SYSTEM) 171 continue; 172 switch (p->p_stat) { 173 case 0: --- 35 unchanged lines hidden (view full) --- 209 paging |= entry->object.vm_object->paging_in_progress; 210 } 211 if (paging) 212 totalp->t_pw++; 213 } 214 /* 215 * Calculate object memory usage statistics. 216 */ |
219 simple_lock(&vm_object_list_lock); | |
220 for (object = vm_object_list.tqh_first; 221 object != NULL; 222 object = object->object_list.tqe_next) { 223 totalp->t_vm += num_pages(object->size); 224 totalp->t_rm += object->resident_page_count; 225 if (object->flags & OBJ_ACTIVE) { 226 totalp->t_avm += num_pages(object->size); 227 totalp->t_arm += object->resident_page_count; --- 13 unchanged lines hidden --- | 217 for (object = vm_object_list.tqh_first; 218 object != NULL; 219 object = object->object_list.tqe_next) { 220 totalp->t_vm += num_pages(object->size); 221 totalp->t_rm += object->resident_page_count; 222 if (object->flags & OBJ_ACTIVE) { 223 totalp->t_avm += num_pages(object->size); 224 totalp->t_arm += object->resident_page_count; --- 13 unchanged lines hidden --- |