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