formerly vm_sw.c; update for new VM
[unix-history] / usr / src / sys / vm / vm_meter.c
CommitLineData
da7c5cc6 1/*
c4ec2128
KM
2 * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
3 * All rights reserved.
da7c5cc6 4 *
dbf0c423 5 * %sccs.include.redist.c%
c4ec2128 6 *
f1f42678 7 * @(#)vm_meter.c 7.10 (Berkeley) %G%
da7c5cc6 8 */
e3bf9f41 9
94368568
JB
10#include "param.h"
11#include "systm.h"
94368568
JB
12#include "user.h"
13#include "proc.h"
94368568 14#include "kernel.h"
f1f42678
KM
15#include "machine/vmparam.h"
16#include "vmmeter.h"
e3bf9f41 17
80b6b780 18fixpt_t averunnable[3]; /* load average, of runnable procs */
e3bf9f41 19
f1f42678
KM
20int maxslp = MAXSLP;
21int saferss = SAFERSS;
e3bf9f41 22
e3bf9f41
BJ
23
24vmmeter()
25{
26 register unsigned *cp, *rp, *sp;
27
f1f42678 28 if (time.tv_sec % 5 == 0)
e3bf9f41 29 vmtotal();
f1f42678 30 if (proc[0].p_slptime > maxslp/2) {
e3bf9f41 31 runout = 0;
e3bf9f41
BJ
32 wakeup((caddr_t)&runout);
33 }
34}
35
e3bf9f41
BJ
36vmtotal()
37{
38 register struct proc *p;
e3bf9f41
BJ
39 int nrun = 0;
40
e3bf9f41
BJ
41 total.t_vm = 0;
42 total.t_avm = 0;
43 total.t_rm = 0;
44 total.t_arm = 0;
45 total.t_rq = 0;
46 total.t_dw = 0;
47 total.t_pw = 0;
48 total.t_sl = 0;
49 total.t_sw = 0;
1d348849 50 for (p = allproc; p != NULL; p = p->p_nxt) {
e3bf9f41
BJ
51 if (p->p_flag & SSYS)
52 continue;
53 if (p->p_stat) {
e3bf9f41
BJ
54 switch (p->p_stat) {
55
56 case SSLEEP:
1a41b211 57 if (p->p_pri <= PZERO && p->p_slptime == 0)
e3bf9f41 58 nrun++;
1a41b211
KM
59 /* fall through */
60 case SSTOP:
e3bf9f41
BJ
61 if (p->p_flag & SPAGE)
62 total.t_pw++;
63 else if (p->p_flag & SLOAD) {
89b899a0 64 if (p->p_pri <= PZERO)
e3bf9f41
BJ
65 total.t_dw++;
66 else if (p->p_slptime < maxslp)
67 total.t_sl++;
68 } else if (p->p_slptime < maxslp)
69 total.t_sw++;
70 if (p->p_slptime < maxslp)
71 goto active;
72 break;
73
74 case SRUN:
75 case SIDL:
76 nrun++;
77 if (p->p_flag & SLOAD)
78 total.t_rq++;
79 else
80 total.t_sw++;
81active:
e3bf9f41
BJ
82 break;
83 }
84 }
85 }
80b6b780 86 loadav(averunnable, nrun);
e3bf9f41
BJ
87}
88
89/*
90 * Constants for averages over 1, 5, and 15 minutes
91 * when sampling at 5 second intervals.
92 */
80b6b780
KM
93fixpt_t cexp[3] = {
94 0.9200444146293232 * FSCALE, /* exp(-1/12) */
95 0.9834714538216174 * FSCALE, /* exp(-1/60) */
96 0.9944598480048967 * FSCALE, /* exp(-1/180) */
e3bf9f41
BJ
97};
98
99/*
100 * Compute a tenex style load average of a quantity on
101 * 1, 5 and 15 minute intervals.
102 */
103loadav(avg, n)
80b6b780 104 register fixpt_t *avg;
e3bf9f41
BJ
105 int n;
106{
107 register int i;
108
109 for (i = 0; i < 3; i++)
80b6b780
KM
110 avg[i] = (cexp[i] * avg[i] + n * FSCALE * (FSCALE - cexp[i]))
111 >> FSHIFT;
b3b807e5 112#if defined(COMPAT_43) && (defined(vax) || defined(tahoe))
80b6b780
KM
113 for (i = 0; i < 3; i++)
114 avenrun[i] = (double) averunnable[i] / FSCALE;
115#endif /* COMPAT_43 */
e3bf9f41 116}