# 2.11BSD#431 - /usr/src/ucb/PORT/systat/swap.c

##### Functions

    closeswap         X
    dmtoindex         X
    fetchswap         X
    initswap          X
    labelswap         X
    openswap          X
    showswap          X
    swapdisplay       X
    swaplabel         X
    vsacct            X

##### Variables

    buckets           X
    colwidth          X
    devnames          X
    dmmax             X
    dmmin             X
    dmtext            X
    nswdev            X
    swdevt            X

##### Macros

    MAXSWAPDEV        X
    OFFSET            X
    X_DMMAX           X
    X_DMMIN           X
    X_DMTEXT          X
    X_NPROC           X
    X_NSWAP           X
    X_NSWDEV          X
    X_NTEXT           X
    X_PROC            X
    X_SWDEVT          X
    X_TEXT            X
    X_USRPT           X
    X_USRPTMAP        X
    swatodev          X
    u                 X

       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

- in /usr/src/ucb/PORT/systat/cmdtab.c line 17, 37

dmtoindex defined in line 157; used 2 times

- in line 74-79(2)

fetchswap defined in line 237; used 2 times

- in /usr/src/ucb/PORT/systat/cmdtab.c line 16, 36

initswap defined in line 197; used 2 times

- in /usr/src/ucb/PORT/systat/cmdtab.c line 17, 37

labelswap defined in line 270; used 2 times

- in /usr/src/ucb/PORT/systat/cmdtab.c line 16, 36

openswap defined in line 20; used 2 times

- in /usr/src/ucb/PORT/systat/cmdtab.c line 18, 37

showswap defined in line 53; used 2 times

- in /usr/src/ucb/PORT/systat/cmdtab.c line 16, 36

swapdisplay defined in line 103; used 2 times

- in line 81, 98

swaplabel defined in line 283; used 2 times

- in line 279-280(2)

vsacct defined in line 135; used 2 times

- in line 91-92(2)

#### Defined variables

buckets defined in line 43; used 4 times

- in line 74-78(2), 113, 148

colwidth defined in line 45; used 10 times

- in line 114-116(3), 125, 278, 292-297(4), 305

devnames defined in line 265; used 1 times

- in line 293

dmmax defined in line 39; used 6 times

- in line 73, 98, 150, 162, 209, 280

dmmin defined in line 38; used 5 times

- in line 111, 139, 162, 208, 300

dmtext defined in line 40; used 6 times

- in line 69-72(3), 81, 210, 279

nlst defined in line 169; used 15 times

- in line 200-202(3), 208-222(9), 230-231(2), 240

nswdev defined in line 41; used 13 times

- in line 73, 112, 207-216(6), 274-278(3), 289, 304

sccsid defined in line 8; never used
swdevt defined in line 44; used 5 times

- in line 214-216(3), 293-294(2)

#### Defined macros

MAXSWAPDEV defined in line 42; used 3 times

- in line 43, 212-213(2)

OFFSET defined in line 101; used 5 times

- in line 114, 278, 292-297(2), 305

X_DMMAX defined in line 182; used 1 times

- in line 209

X_DMMIN defined in line 180; used 1 times

- in line 208

X_DMTEXT defined in line 184; used 1 times

- in line 210

X_NPROC defined in line 172; used 1 times

- in line 222

X_NSWAP defined in line 178; never used
X_NSWDEV defined in line 186; used 1 times

- in line 211

X_NTEXT defined in line 190; used 1 times

- in line 217

X_PROC defined in line 170; used 4 times

- in line 200-202(2), 221, 240

X_SWDEVT defined in line 188; used 1 times

- in line 215

X_TEXT defined in line 192; used 1 times

- in line 218

X_USRPT defined in line 176; used 1 times

- in line 230

X_USRPTMAP defined in line 174; used 1 times

- in line 231

swatodev defined in line 73; used 3 times

- in line 74-78(2), 148

u defined in line 51; used 2 times

- in line 91-92(2)

Last modified: 1986-04-12 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1414 |