xref: /original-bsd/usr.bin/systat/swap.c (revision d54be081)
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.10 (Berkeley) 06/26/91";
9 #endif not lint
10 
11 #include "systat.h"
12 #ifdef NOTDEF
13 #include <sys/user.h>
14 #include <sys/proc.h>
15 #include <sys/conf.h>
16 #include <sys/stat.h>
17 #include <machine/pte.h>
18 #include <paths.h>
19 #endif NOTDEF
20 
21 WINDOW *
22 openswap()
23 {
24 	return (subwin(stdscr, LINES-5-1, 0, 5, 0));
25 }
26 
27 closeswap(w)
28 	WINDOW *w;
29 {
30 	if (w == NULL)
31 		return;
32 	wclear(w);
33 	wrefresh(w);
34 	delwin(w);
35 }
36 
37 #ifdef NOTDEF
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 #endif NOTDEF
47 
48 showswap()
49 {
50 #ifdef NOTDEF
51 	register int i, j;
52 	register struct proc *pp;
53 	register struct text *xp;
54 	register int row;
55 	register int ts;
56 	register swblk_t *dp;
57 
58 	if (xtext == 0)
59 		return;
60 	for (xp = xtext; xp < &xtext[ntext]; xp++) {
61 		if (xp->x_vptr == NULL)
62 			continue;
63 		ts = ctod(xp->x_size);
64 		dp = xp->x_daddr;
65 		for (i = 0; i < ts; i += dmtext) {
66 			j = ts - i;
67 			if (j > dmtext)
68 				j = dmtext;
69 #define	swatodev(addr)	(((addr) / dmmax) % nswdev)
70 			buckets[swatodev(*dp)][dmtoindex(j)]++;
71 			dp++;
72 		}
73 		if ((xp->x_flag & XPAGV) && xp->x_ptdaddr)
74 			buckets[swatodev(xp->x_ptdaddr)]
75 			    [dmtoindex(ctod(ctopt(xp->x_size)))]++;
76 	}
77 	row = swapdisplay(2, dmtext, 'X');
78 	if (kprocp == NULL)
79 		return;
80 	/* TODO - traverse procs { */
81 		if (pp->p_stat == 0 || pp->p_stat == SZOMB)
82 			continue;
83 		if (pp->p_flag & SSYS)
84 			continue;
85 		if (getu(pp) == 0)
86 			continue;
87 		vsacct(&u.u_dmap);
88 		vsacct(&u.u_smap);
89 #ifdef notdef
90 		if ((pp->p_flag & SLOAD) == 0)
91 			vusize(pp);
92 #endif
93 	}
94 	(void) swapdisplay(1+row, dmmax, 'X');
95 #endif NOTDEF
96 }
97 
98 #define	OFFSET	5			/* left hand column */
99 
100 swapdisplay(baserow, dmbound, c)
101 	int baserow, dmbound;
102 	char c;
103 {
104 #ifdef NOTDEF
105 	register int i, j, k, row;
106 	register short *pb;
107 	char buf[10];
108 
109 	for (row = baserow, i = dmmin; i <= dmbound; i *= 2, row++) {
110 		for (j = 0; j < nswdev; j++) {
111 			pb = &buckets[j][row - baserow];
112 			wmove(wnd, row, OFFSET + j * (1 + colwidth));
113 			k = MIN(*pb, colwidth);
114 			if (*pb > colwidth) {
115 				sprintf(buf, " %d", *pb);
116 				k -= strlen(buf);
117 				while (k--)
118 					waddch(wnd, c);
119 				waddstr(wnd, buf);
120 			} else {
121 				while (k--)
122 					waddch(wnd, c);
123 				k = MAX(colwidth - *pb, 0);
124 				while (k--)
125 					waddch(wnd, ' ');
126 			}
127 			*pb = 0;
128 		}
129 	}
130 	return (row);
131 #endif NOTDEF
132 }
133 
134 vsacct(dmp)
135 	register struct dmap *dmp;
136 {
137 #ifdef NOTDEF
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 #endif NOTDEF
156 }
157 
158 dmtoindex(dm)
159 	int dm;
160 {
161 #ifdef NOTDEF
162 	register int i, j;
163 
164 	for (j = 0, i = dmmin; i <= dmmax; i *= 2, j++)
165 		if (dm <= i)
166 			return (j);
167 	error("dmtoindex(%d)", dm);
168 	return (NDMAP - 1);
169 #endif NOTDEF
170 }
171 
172 static struct nlist nlst[] = {
173 #define X_FIRST		0
174 #define X_NSWAP         0
175 	{ "_nswap" },
176 #define X_DMMIN         1
177 	{ "_dmmin" },
178 #define X_DMMAX         2
179 	{ "_dmmax" },
180 #define	X_DMTEXT	3
181 	{ "_dmtext" },
182 #define X_NSWDEV        4
183 	{ "_nswdev" },
184 #define	X_SWDEVT	5
185 	{ "_swdevt" },
186 #define	X_NTEXT		6
187 	{ "_ntext" },
188 #define	X_TEXT		7
189 	{ "_text" },
190 	{ "" }
191 };
192 
193 initswap()
194 {
195 #ifdef NOTDEF
196 	if (nlst[X_FIRST].n_type == 0) {
197 		kvm_nlist(nlst);
198 		if (nlst[X_FIRST].n_type == 0) {
199 			error("namelist on %s failed", _PATH_UNIX);
200 			return(0);
201 		}
202 	}
203 	if (nswdev == 0) {
204 		NREAD(X_DMMIN, &dmmin, LONG);
205 		NREAD(X_DMMAX, &dmmax, LONG);
206 		NREAD(X_DMTEXT, &dmtext, LONG);
207 		NREAD(X_NSWDEV, &nswdev, LONG);
208 		if (nswdev > MAXSWAPDEV)
209 			nswdev = MAXSWAPDEV;
210 		swdevt = (struct swdevt *)calloc(nswdev, sizeof (*swdevt));
211 		NREAD(X_SWDEVT, swdevt, nswdev * sizeof (struct swdevt));
212 		NREAD(X_NTEXT, &ntext, LONG);
213 		NREAD(X_TEXT, &textp, LONG);
214 	}
215 	if (xtext == NULL)
216 		xtext = (struct text *)calloc(ntext, sizeof (struct text));
217 	return(1);
218 #endif NOTDEF
219 }
220 
221 fetchswap()
222 {
223 #ifdef NOTDEF
224 	if (nlst[X_FIRST].n_type == 0)
225 		return;
226 	/*
227 	 * TODO - read procs
228 	 */
229 	if (xtext == NULL) {
230 		xtext = (struct text *)calloc(ntext, sizeof (struct text));
231 		if (xtext == NULL)
232 			return;
233 	}
234 	if (!KREAD(textp, xtext, ntext * sizeof (struct text)))
235 		error("couldn't read text table");
236 #endif NOTDEF
237 }
238 
239 labelswap()
240 {
241 #ifdef NOTDEF
242 	register int row;
243 
244 	if (nswdev == 0) {
245 		error("Don't know how many swap devices.\n");
246 		return;
247 	}
248 	colwidth = (COLS - OFFSET - (nswdev - 1)) / nswdev;
249 	row = swaplabel(0, dmtext, 1);
250 	(void) swaplabel(row, dmmax, 0);
251 #endif NOTDEF
252 }
253 
254 swaplabel(row, dmbound, donames)
255 	register int row;
256 	int dmbound, donames;
257 {
258 #ifdef NOTDEF
259 	register int i, j;
260 
261 	for (i = 0; i < nswdev; i++) {
262 		if (donames)
263 			mvwprintw(wnd,
264 			    row, OFFSET + i*(1 + colwidth) + (colwidth - 3)/2,
265 			    "%s", devname(swdevt[i].sw_dev, S_IFBLK));
266 		for (j = 0; j + 5 < colwidth; j += 5)
267 			mvwprintw(wnd, row + donames,
268 			    OFFSET + i*(1 + colwidth) + j, "/%-2d  ", j);
269 	}
270 	row += 1 + donames;
271 	for (j = 0, i = dmmin; i <= dmbound; i *= 2, j++, row++) {
272 		int k;
273 
274 		mvwprintw(wnd, row, 0, "%4d|", i);
275 		for (k = 1; k < nswdev; k++)
276 			mvwaddch(wnd, row, OFFSET + k*(1 + colwidth) - 1, '|');
277 	}
278 	return (row);
279 #endif NOTDEF
280 }
281