UNMATCHED SPL() CALL IN VM SYSTEM
[unix-history] / usr / src / sys.386bsd / vm / vm_meter.c
CommitLineData
b688fc87
WJ
1/*
2 * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
3 * 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
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
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 7.11 (Berkeley) 4/20/91
34 */
35
36#include "param.h"
37#include "proc.h"
38#include "systm.h"
39#include "kernel.h"
40
41#include "vm_param.h"
42#include "vmmeter.h"
43
44fixpt_t averunnable[3]; /* load average, of runnable procs */
45
46int maxslp = MAXSLP;
47int saferss = SAFERSS;
48
49
50vmmeter()
51{
52 register unsigned *cp, *rp, *sp;
53
54 if (time.tv_sec % 5 == 0)
55 vmtotal();
56 if (proc0.p_slptime > maxslp/2)
57 wakeup((caddr_t)&proc0);
58}
59
60vmtotal()
61{
62 register struct proc *p;
63 int nrun = 0;
64
65 total.t_vm = 0;
66 total.t_avm = 0;
67 total.t_rm = 0;
68 total.t_arm = 0;
69 total.t_rq = 0;
70 total.t_dw = 0;
71 total.t_pw = 0;
72 total.t_sl = 0;
73 total.t_sw = 0;
74 for (p = allproc; p != NULL; p = p->p_nxt) {
75 if (p->p_flag & SSYS)
76 continue;
77 if (p->p_stat) {
78 switch (p->p_stat) {
79
80 case SSLEEP:
81 if (p->p_pri <= PZERO && p->p_slptime == 0)
82 nrun++;
83 /* fall through */
84 case SSTOP:
85#ifdef notdef
86 if (p->p_flag & SPAGE)
87 total.t_pw++;
88 else
89#endif
90 if (p->p_flag & SLOAD) {
91 if (p->p_pri <= PZERO)
92 total.t_dw++;
93 else if (p->p_slptime < maxslp)
94 total.t_sl++;
95 } else if (p->p_slptime < maxslp)
96 total.t_sw++;
97 if (p->p_slptime < maxslp)
98 goto active;
99 break;
100
101 case SRUN:
102 case SIDL:
103 nrun++;
104 if (p->p_flag & SLOAD)
105 total.t_rq++;
106 else
107 total.t_sw++;
108active:
109 break;
110 }
111 }
112 }
113 loadav(averunnable, nrun);
114}
115
116/*
117 * Constants for averages over 1, 5, and 15 minutes
118 * when sampling at 5 second intervals.
119 */
120fixpt_t cexp[3] = {
121 0.9200444146293232 * FSCALE, /* exp(-1/12) */
122 0.9834714538216174 * FSCALE, /* exp(-1/60) */
123 0.9944598480048967 * FSCALE, /* exp(-1/180) */
124};
125
126/*
127 * Compute a tenex style load average of a quantity on
128 * 1, 5 and 15 minute intervals.
129 */
130loadav(avg, n)
131 register fixpt_t *avg;
132 int n;
133{
134 register int i;
135
136 for (i = 0; i < 3; i++)
137 avg[i] = (cexp[i] * avg[i] + n * FSCALE * (FSCALE - cexp[i]))
138 >> FSHIFT;
139#if defined(COMPAT_43) && (defined(vax) || defined(tahoe))
140 for (i = 0; i < 3; i++)
141 avenrun[i] = (double) averunnable[i] / FSCALE;
142#endif /* COMPAT_43 */
143}