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