Annotation of 43BSD/ucb/systat/swap.c, revision 1.1.1.1

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.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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.