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

Defined functions

closeswap defined in line 27; used 2 times
dmtoindex defined in line 157; used 2 times
fetchswap defined in line 237; used 2 times
initswap defined in line 197; used 2 times
labelswap defined in line 270; used 2 times
openswap defined in line 20; used 2 times
showswap defined in line 53; used 2 times
swapdisplay defined in line 103; used 2 times
swaplabel defined in line 283; used 2 times
vsacct defined in line 135; used 2 times

Defined variables

buckets defined in line 43; used 4 times
colwidth defined in line 45; used 10 times
devnames defined in line 265; used 1 times
dmmax defined in line 39; used 6 times
dmmin defined in line 38; used 5 times
dmtext defined in line 40; used 6 times
nlst defined in line 169; used 15 times
nswdev defined in line 41; used 13 times
sccsid defined in line 8; never used
swdevt defined in line 44; used 5 times

Defined macros

MAXSWAPDEV defined in line 42; used 3 times
OFFSET defined in line 101; used 5 times
X_DMMAX defined in line 182; used 1 times
X_DMMIN defined in line 180; used 1 times
X_DMTEXT defined in line 184; used 1 times
X_NPROC defined in line 172; used 1 times
X_NSWAP defined in line 178; never used
X_NSWDEV defined in line 186; used 1 times
X_NTEXT defined in line 190; used 1 times
X_PROC defined in line 170; used 4 times
X_SWDEVT defined in line 188; used 1 times
X_TEXT defined in line 192; used 1 times
X_USRPT defined in line 176; used 1 times
X_USRPTMAP defined in line 174; used 1 times
swatodev defined in line 73; used 3 times
u defined in line 51; used 2 times
Last modified: 1986-04-12
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1595
Valid CSS Valid XHTML 1.0 Strict