|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)swap.c 5.3 (Berkeley) 4/12/86";
9: #endif not lint
10:
11: #include "systat.h"
12: #include <sys/dir.h>
13: #include <sys/user.h>
14: #include <sys/proc.h>
15: #include <sys/text.h>
16: #include <sys/conf.h>
17: #include <sys/vmmac.h>
18: #include <machine/pte.h>
19:
20: WINDOW *
21: openswap()
22: {
23:
24: return (subwin(stdscr, LINES-5-1, 0, 5, 0));
25: }
26:
27: closeswap(w)
28: WINDOW *w;
29: {
30:
31: if (w == NULL)
32: return;
33: wclear(w);
34: wrefresh(w);
35: delwin(w);
36: }
37:
38: int dmmin;
39: int dmmax;
40: int dmtext;
41: int nswdev;
42: #define MAXSWAPDEV 4
43: short buckets[MAXSWAPDEV][NDMAP];
44: struct swdevt *swdevt;
45: int colwidth;
46:
47: extern union {
48: struct user user;
49: char upages[UPAGES][NBPG];
50: } user;
51: #define u user.user
52:
53: showswap()
54: {
55: register int i, j;
56: register struct proc *pp;
57: register struct text *xp;
58: register int row;
59: register int ts;
60: register swblk_t *dp;
61:
62: if (xtext == 0)
63: return;
64: for (xp = xtext; xp < &xtext[ntext]; xp++) {
65: if (xp->x_iptr == NULL)
66: continue;
67: ts = ctod(xp->x_size);
68: dp = xp->x_daddr;
69: for (i = 0; i < ts; i += dmtext) {
70: j = ts - i;
71: if (j > dmtext)
72: j = dmtext;
73: #define swatodev(addr) (((addr) / dmmax) % nswdev)
74: buckets[swatodev(*dp)][dmtoindex(j)]++;
75: dp++;
76: }
77: if ((xp->x_flag & XPAGI) && xp->x_ptdaddr)
78: buckets[swatodev(xp->x_ptdaddr)]
79: [dmtoindex(ctod(ctopt(xp->x_size)))]++;
80: }
81: row = swapdisplay(2, dmtext, 'X');
82: if (kprocp == NULL)
83: return;
84: for (i = 0, pp = kprocp; i < nproc; i++, pp++) {
85: if (pp->p_stat == 0 || pp->p_stat == SZOMB)
86: continue;
87: if (pp->p_flag & SSYS)
88: continue;
89: if (getu(pp) == 0)
90: continue;
91: vsacct(&u.u_dmap);
92: vsacct(&u.u_smap);
93: #ifdef notdef
94: if ((pp->p_flag & SLOAD) == 0)
95: vusize(pp);
96: #endif
97: }
98: (void) swapdisplay(1+row, dmmax, 'X');
99: }
100:
101: #define OFFSET 5 /* left hand column */
102:
103: swapdisplay(baserow, dmbound, c)
104: int baserow, dmbound;
105: char c;
106: {
107: register int i, j, k, row;
108: register short *pb;
109: char buf[10];
110:
111: for (row = baserow, i = dmmin; i <= dmbound; i *= 2, row++) {
112: for (j = 0; j < nswdev; j++) {
113: pb = &buckets[j][row - baserow];
114: wmove(wnd, row, OFFSET + j * (1 + colwidth));
115: k = MIN(*pb, colwidth);
116: if (*pb > colwidth) {
117: sprintf(buf, " %d", *pb);
118: k -= strlen(buf);
119: while (k--)
120: waddch(wnd, c);
121: waddstr(wnd, buf);
122: } else {
123: while (k--)
124: waddch(wnd, c);
125: k = MAX(colwidth - *pb, 0);
126: while (k--)
127: waddch(wnd, ' ');
128: }
129: *pb = 0;
130: }
131: }
132: return (row);
133: }
134:
135: vsacct(dmp)
136: register struct dmap *dmp;
137: {
138: register swblk_t *ip;
139: register int blk = dmmin, index = 0;
140:
141: for (ip = dmp->dm_map; dmp->dm_alloc > 0; ip++) {
142: if (ip - dmp->dm_map >= NDMAP) {
143: error("vsacct NDMAP");
144: break;
145: }
146: if (*ip == 0)
147: error("vsacct *ip == 0");
148: buckets[swatodev(*ip)][index]++;
149: dmp->dm_alloc -= blk;
150: if (blk < dmmax) {
151: blk *= 2;
152: index++;
153: }
154: }
155: }
156:
157: dmtoindex(dm)
158: int dm;
159: {
160: register int i, j;
161:
162: for (j = 0, i = dmmin; i <= dmmax; i *= 2, j++)
163: if (dm <= i)
164: return (j);
165: error("dmtoindex(%d)", dm);
166: return (NDMAP - 1);
167: }
168:
169: static struct nlist nlst[] = {
170: #define X_PROC 0
171: { "_proc" },
172: #define X_NPROC 1
173: { "_nproc" },
174: #define X_USRPTMAP 2
175: { "_Usrptmap" },
176: #define X_USRPT 3
177: { "_usrpt" },
178: #define X_NSWAP 4
179: { "_nswap" },
180: #define X_DMMIN 5
181: { "_dmmin" },
182: #define X_DMMAX 6
183: { "_dmmax" },
184: #define X_DMTEXT 7
185: { "_dmtext" },
186: #define X_NSWDEV 8
187: { "_nswdev" },
188: #define X_SWDEVT 9
189: { "_swdevt" },
190: #define X_NTEXT 10
191: { "_ntext" },
192: #define X_TEXT 11
193: { "_text" },
194: { "" }
195: };
196:
197: initswap()
198: {
199:
200: if (nlst[X_PROC].n_type == 0) {
201: nlist("/vmunix", nlst);
202: if (nlst[X_PROC].n_type == 0) {
203: error("namelist on /vmunix failed");
204: return(0);
205: }
206: }
207: if (nswdev == 0) {
208: dmmin = getw(nlst[X_DMMIN].n_value);
209: dmmax = getw(nlst[X_DMMAX].n_value);
210: dmtext = getw(nlst[X_DMTEXT].n_value);
211: nswdev = getw(nlst[X_NSWDEV].n_value);
212: if (nswdev > MAXSWAPDEV)
213: nswdev = MAXSWAPDEV;
214: swdevt = (struct swdevt *)calloc(nswdev, sizeof (*swdevt));
215: klseek(kmem, nlst[X_SWDEVT].n_value, L_SET);
216: read(kmem, swdevt, nswdev * sizeof (struct swdevt));
217: ntext = getw(nlst[X_NTEXT].n_value);
218: textp = getw(nlst[X_TEXT].n_value);
219: }
220: if (procp == NULL) {
221: procp = getw(nlst[X_PROC].n_value);
222: nproc = getw(nlst[X_NPROC].n_value);
223: }
224: if (xtext == NULL)
225: xtext = (struct text *)calloc(ntext, sizeof (struct text));
226: if (kprocp == NULL)
227: kprocp = (struct proc *)calloc(nproc, sizeof (struct proc));
228: if (usrpt != NULL)
229: return(1);
230: usrpt = (struct pte *)nlst[X_USRPT].n_value;
231: Usrptma = (struct pte *)nlst[X_USRPTMAP].n_value;
232: if (pt == NULL)
233: pt = (struct p_times *)malloc(nproc * sizeof (struct p_times));
234: return(1);
235: }
236:
237: fetchswap()
238: {
239:
240: if (nlst[X_PROC].n_type == 0)
241: return;
242: if (kprocp == NULL) {
243: kprocp = (struct proc *)malloc(sizeof (*kprocp) * nproc);
244: if (kprocp == NULL)
245: return;
246: }
247: lseek(kmem, procp, L_SET);
248: if (read(kmem, kprocp, sizeof (struct proc) * nproc) !=
249: sizeof (struct proc) * nproc) {
250: error("couldn't read proc table");
251: return;
252: }
253: if (xtext == NULL) {
254: xtext = (struct text *)calloc(ntext, sizeof (struct text));
255: if (xtext == NULL)
256: return;
257: }
258: lseek(kmem, textp, L_SET);
259: if (read(kmem, xtext, ntext * sizeof (struct text)) !=
260: sizeof (struct text) * ntext)
261: error("couldn't read text table");
262: }
263:
264: #ifdef vax
265: char *devnames[] =
266: { "hp", "ht", "up", "rk", "sw", "tm", "ts", "mt", "tu", "ra", "ut",
267: "rb", "rx", "rl" };
268: #endif
269:
270: labelswap()
271: {
272: register int row;
273:
274: if (nswdev == 0) {
275: error("Don't know how many swap devices.\n");
276: return;
277: }
278: colwidth = (COLS - OFFSET - (nswdev - 1)) / nswdev;
279: row = swaplabel(0, dmtext, 1);
280: (void) swaplabel(row, dmmax, 0);
281: }
282:
283: swaplabel(row, dmbound, donames)
284: register int row;
285: int dmbound, donames;
286: {
287: register int i, j;
288:
289: for (i = 0; i < nswdev; i++) {
290: if (donames)
291: mvwprintw(wnd,
292: row, OFFSET + i*(1 + colwidth) + (colwidth - 3)/2,
293: "%s%d", devnames[major(swdevt[i].sw_dev)],
294: minor(swdevt[i].sw_dev) >> 3);
295: for (j = 0; j + 5 < colwidth; j += 5)
296: mvwprintw(wnd, row + donames,
297: OFFSET + i*(1 + colwidth) + j, "/%-2d ", j);
298: }
299: row += 1 + donames;
300: for (j = 0, i = dmmin; i <= dmbound; i *= 2, j++, row++) {
301: int k;
302:
303: mvwprintw(wnd, row, 0, "%4d|", i);
304: for (k = 1; k < nswdev; k++)
305: mvwaddch(wnd, row, OFFSET + k*(1 + colwidth) - 1, '|');
306: }
307: return (row);
308: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.