Annotation of 43BSDReno/usr.bin/systat/swap.c, revision 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.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: }

unix.superglobalmegacorp.com

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