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