|
|
1.1 ! root 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.7 (Berkeley) 2/25/90"; ! 9: #endif not lint ! 10: ! 11: #include "systat.h" ! 12: #include <sys/user.h> ! 13: #include <sys/proc.h> ! 14: #include <sys/text.h> ! 15: #include <sys/conf.h> ! 16: #include <sys/vmmac.h> ! 17: #include <machine/pte.h> ! 18: #include <paths.h> ! 19: ! 20: WINDOW * ! 21: openswap() ! 22: { ! 23: return (subwin(stdscr, LINES-5-1, 0, 5, 0)); ! 24: } ! 25: ! 26: closeswap(w) ! 27: WINDOW *w; ! 28: { ! 29: if (w == NULL) ! 30: return; ! 31: wclear(w); ! 32: wrefresh(w); ! 33: delwin(w); ! 34: } ! 35: ! 36: int dmmin; ! 37: int dmmax; ! 38: int dmtext; ! 39: int nswdev; ! 40: #define MAXSWAPDEV 4 ! 41: short buckets[MAXSWAPDEV][NDMAP]; ! 42: struct swdevt *swdevt; ! 43: int colwidth; ! 44: ! 45: extern union { ! 46: struct user user; ! 47: char upages[UPAGES][NBPG]; ! 48: } user; ! 49: #define u user.user ! 50: ! 51: showswap() ! 52: { ! 53: register int i, j; ! 54: register struct proc *pp; ! 55: register struct text *xp; ! 56: register int row; ! 57: register int ts; ! 58: register swblk_t *dp; ! 59: ! 60: if (xtext == 0) ! 61: return; ! 62: for (xp = xtext; xp < &xtext[ntext]; xp++) { ! 63: if (xp->x_vptr == NULL) ! 64: continue; ! 65: ts = ctod(xp->x_size); ! 66: dp = xp->x_daddr; ! 67: for (i = 0; i < ts; i += dmtext) { ! 68: j = ts - i; ! 69: if (j > dmtext) ! 70: j = dmtext; ! 71: #define swatodev(addr) (((addr) / dmmax) % nswdev) ! 72: buckets[swatodev(*dp)][dmtoindex(j)]++; ! 73: dp++; ! 74: } ! 75: if ((xp->x_flag & XPAGV) && xp->x_ptdaddr) ! 76: buckets[swatodev(xp->x_ptdaddr)] ! 77: [dmtoindex(ctod(ctopt(xp->x_size)))]++; ! 78: } ! 79: row = swapdisplay(2, dmtext, 'X'); ! 80: if (kprocp == NULL) ! 81: return; ! 82: for (i = 0, pp = kprocp; i < nproc; i++, pp++) { ! 83: if (pp->p_stat == 0 || pp->p_stat == SZOMB) ! 84: continue; ! 85: if (pp->p_flag & SSYS) ! 86: continue; ! 87: if (getu(pp) == 0) ! 88: continue; ! 89: vsacct(&u.u_dmap); ! 90: vsacct(&u.u_smap); ! 91: #ifdef notdef ! 92: if ((pp->p_flag & SLOAD) == 0) ! 93: vusize(pp); ! 94: #endif ! 95: } ! 96: (void) swapdisplay(1+row, dmmax, 'X'); ! 97: } ! 98: ! 99: #define OFFSET 5 /* left hand column */ ! 100: ! 101: swapdisplay(baserow, dmbound, c) ! 102: int baserow, dmbound; ! 103: char c; ! 104: { ! 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: } ! 132: ! 133: vsacct(dmp) ! 134: register struct dmap *dmp; ! 135: { ! 136: register swblk_t *ip; ! 137: register int blk = dmmin, index = 0; ! 138: ! 139: for (ip = dmp->dm_map; dmp->dm_alloc > 0; ip++) { ! 140: if (ip - dmp->dm_map >= NDMAP) { ! 141: error("vsacct NDMAP"); ! 142: break; ! 143: } ! 144: if (*ip == 0) ! 145: error("vsacct *ip == 0"); ! 146: buckets[swatodev(*ip)][index]++; ! 147: dmp->dm_alloc -= blk; ! 148: if (blk < dmmax) { ! 149: blk *= 2; ! 150: index++; ! 151: } ! 152: } ! 153: } ! 154: ! 155: dmtoindex(dm) ! 156: int dm; ! 157: { ! 158: register int i, j; ! 159: ! 160: for (j = 0, i = dmmin; i <= dmmax; i *= 2, j++) ! 161: if (dm <= i) ! 162: return (j); ! 163: error("dmtoindex(%d)", dm); ! 164: return (NDMAP - 1); ! 165: } ! 166: ! 167: static struct nlist nlst[] = { ! 168: #define X_PROC 0 ! 169: { "_proc" }, ! 170: #define X_NPROC 1 ! 171: { "_nproc" }, ! 172: #define X_USRPTMAP 2 ! 173: { "_Usrptmap" }, ! 174: #define X_USRPT 3 ! 175: { "_usrpt" }, ! 176: #define X_NSWAP 4 ! 177: { "_nswap" }, ! 178: #define X_DMMIN 5 ! 179: { "_dmmin" }, ! 180: #define X_DMMAX 6 ! 181: { "_dmmax" }, ! 182: #define X_DMTEXT 7 ! 183: { "_dmtext" }, ! 184: #define X_NSWDEV 8 ! 185: { "_nswdev" }, ! 186: #define X_SWDEVT 9 ! 187: { "_swdevt" }, ! 188: #define X_NTEXT 10 ! 189: { "_ntext" }, ! 190: #define X_TEXT 11 ! 191: { "_text" }, ! 192: { "" } ! 193: }; ! 194: ! 195: initswap() ! 196: { ! 197: if (nlst[X_PROC].n_type == 0) { ! 198: nlist(_PATH_UNIX, nlst); ! 199: if (nlst[X_PROC].n_type == 0) { ! 200: error("namelist on %s failed", _PATH_UNIX); ! 201: return(0); ! 202: } ! 203: } ! 204: if (nswdev == 0) { ! 205: dmmin = getw(nlst[X_DMMIN].n_value); ! 206: dmmax = getw(nlst[X_DMMAX].n_value); ! 207: dmtext = getw(nlst[X_DMTEXT].n_value); ! 208: nswdev = getw(nlst[X_NSWDEV].n_value); ! 209: if (nswdev > MAXSWAPDEV) ! 210: nswdev = MAXSWAPDEV; ! 211: swdevt = (struct swdevt *)calloc(nswdev, sizeof (*swdevt)); ! 212: klseek(kmem, nlst[X_SWDEVT].n_value, L_SET); ! 213: read(kmem, swdevt, nswdev * sizeof (struct swdevt)); ! 214: ntext = getw(nlst[X_NTEXT].n_value); ! 215: textp = getw(nlst[X_TEXT].n_value); ! 216: } ! 217: if (procp == NULL) { ! 218: procp = getw(nlst[X_PROC].n_value); ! 219: nproc = getw(nlst[X_NPROC].n_value); ! 220: } ! 221: if (xtext == NULL) ! 222: xtext = (struct text *)calloc(ntext, sizeof (struct text)); ! 223: if (kprocp == NULL) ! 224: kprocp = (struct proc *)calloc(nproc, sizeof (struct proc)); ! 225: if (usrpt != NULL) ! 226: return(1); ! 227: usrpt = (struct pte *)nlst[X_USRPT].n_value; ! 228: Usrptma = (struct pte *)nlst[X_USRPTMAP].n_value; ! 229: if (pt == NULL) ! 230: pt = (struct p_times *)malloc(nproc * sizeof (struct p_times)); ! 231: return(1); ! 232: } ! 233: ! 234: fetchswap() ! 235: { ! 236: if (nlst[X_PROC].n_type == 0) ! 237: return; ! 238: if (kprocp == NULL) { ! 239: kprocp = (struct proc *)malloc(sizeof (*kprocp) * nproc); ! 240: if (kprocp == NULL) ! 241: return; ! 242: } ! 243: lseek(kmem, procp, L_SET); ! 244: if (read(kmem, kprocp, sizeof (struct proc) * nproc) != ! 245: sizeof (struct proc) * nproc) { ! 246: error("couldn't read proc table"); ! 247: return; ! 248: } ! 249: if (xtext == NULL) { ! 250: xtext = (struct text *)calloc(ntext, sizeof (struct text)); ! 251: if (xtext == NULL) ! 252: return; ! 253: } ! 254: lseek(kmem, textp, L_SET); ! 255: if (read(kmem, xtext, ntext * sizeof (struct text)) != ! 256: sizeof (struct text) * ntext) ! 257: error("couldn't read text table"); ! 258: } ! 259: ! 260: #ifdef vax ! 261: char *devnames[] = ! 262: { "hp", "ht", "up", "rk", "sw", "tm", "ts", "mt", "tu", "ra", "ut", ! 263: "rb", "rx", "rl" }; ! 264: #endif ! 265: #ifdef tahoe ! 266: char *devnames[] = { "ud", "vd", "xp", "cy", "sw" }; ! 267: #endif ! 268: ! 269: labelswap() ! 270: { ! 271: register int row; ! 272: ! 273: if (nswdev == 0) { ! 274: error("Don't know how many swap devices.\n"); ! 275: return; ! 276: } ! 277: colwidth = (COLS - OFFSET - (nswdev - 1)) / nswdev; ! 278: row = swaplabel(0, dmtext, 1); ! 279: (void) swaplabel(row, dmmax, 0); ! 280: } ! 281: ! 282: swaplabel(row, dmbound, donames) ! 283: register int row; ! 284: int dmbound, donames; ! 285: { ! 286: register int i, j; ! 287: ! 288: for (i = 0; i < nswdev; i++) { ! 289: if (donames) ! 290: mvwprintw(wnd, ! 291: row, OFFSET + i*(1 + colwidth) + (colwidth - 3)/2, ! 292: "%s%d", devnames[major(swdevt[i].sw_dev)], ! 293: minor(swdevt[i].sw_dev) >> 3); ! 294: for (j = 0; j + 5 < colwidth; j += 5) ! 295: mvwprintw(wnd, row + donames, ! 296: OFFSET + i*(1 + colwidth) + j, "/%-2d ", j); ! 297: } ! 298: row += 1 + donames; ! 299: for (j = 0, i = dmmin; i <= dmbound; i *= 2, j++, row++) { ! 300: int k; ! 301: ! 302: mvwprintw(wnd, row, 0, "%4d|", i); ! 303: for (k = 1; k < nswdev; k++) ! 304: mvwaddch(wnd, row, OFFSET + k*(1 + colwidth) - 1, '|'); ! 305: } ! 306: return (row); ! 307: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.