Commit | Line | Data |
---|---|---|
ce3b185b | 1 | #ifndef lint |
d830bff6 | 2 | static char *sccsid = "@(#)swap.c 1.5 (Lucasfilm) %G%"; |
ce3b185b SL |
3 | #endif |
4 | ||
5 | #include "systat.h" | |
6 | ||
d830bff6 SL |
7 | WINDOW * |
8 | openswap() | |
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 |
17 | closeswap(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 |
29 | int dmmin; |
30 | int dmmax; | |
31 | int dmtext; | |
32 | int nswdev; | |
33 | #define MAXSWAPDEV 4 | |
34 | short buckets[MAXSWAPDEV][NDMAP]; | |
35 | struct swdevt *swdevt; | |
e7a897ca SL |
36 | int colwidth; |
37 | ||
852c7064 SL |
38 | extern union { |
39 | struct user user; | |
40 | char upages[UPAGES][NBPG]; | |
41 | } user; | |
42 | #define u user.user | |
43 | ||
ce3b185b SL |
44 | showswap() |
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 |
92 | swapdisplay(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 |
124 | vsacct(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 | ||
146 | dmtoindex(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 | |
158 | static 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 | ||
186 | initswap() | |
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 | ||
223 | fetchswap() | |
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 | |
251 | char *devnames[] = | |
252 | { "hp", "ht", "up", "rk", "sw", "tm", "ts", "mt", "tu", "ra", "ut", | |
253 | "rb", "rx", "rl" }; | |
254 | #endif | |
255 | ||
256 | labelswap() | |
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 | ||
271 | swaplabel(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 | } |