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