Annotation of 42BSD/usr.bin/iostat.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)iostat.c    4.9 (Berkeley) 83/09/25";
                      2: /*
                      3:  * iostat
                      4:  */
                      5: #include <stdio.h>
                      6: #include <nlist.h>
                      7: #include <sys/types.h>
                      8: #include <sys/buf.h>
                      9: #include <sys/dk.h>
                     10: #ifdef vax
                     11: #include <vaxuba/ubavar.h>
                     12: #include <vaxmba/mbavar.h>
                     13: #endif
                     14: #ifdef sun
                     15: #include <sundev/mbvar.h>
                     16: #endif
                     17: 
                     18: struct nlist nl[] = {
                     19:        { "_dk_busy" },
                     20: #define        X_DK_BUSY       0
                     21:        { "_dk_time" },
                     22: #define        X_DK_TIME       1
                     23:        { "_dk_xfer" },
                     24: #define        X_DK_XFER       2
                     25:        { "_dk_wds" },
                     26: #define        X_DK_WDS        3
                     27:        { "_tk_nin" },
                     28: #define        X_TK_NIN        4
                     29:        { "_tk_nout" },
                     30: #define        X_TK_NOUT       5
                     31:        { "_dk_seek" },
                     32: #define        X_DK_SEEK       6
                     33:        { "_cp_time" },
                     34: #define        X_CP_TIME       7
                     35:        { "_dk_mspw" },
                     36: #define        X_DK_MSPW       8
                     37:        { "_hz" },
                     38: #define        X_HZ            9
                     39: 
                     40: #ifdef vax
                     41:        { "_mbdinit" },
                     42: #define X_MBDINIT      10
                     43:        { "_ubdinit" },
                     44: #define X_UBDINIT      11
                     45: #endif
                     46: #ifdef sun
                     47:        { "_mbdinit" },
                     48: #define X_MBDINIT      10
                     49: #endif
                     50:        { 0 },
                     51: };
                     52: 
                     53: char dr_name[DK_NDRIVE][10];
                     54: 
                     55: struct
                     56: {
                     57:        int     dk_busy;
                     58:        long    cp_time[CPUSTATES];
                     59:        long    dk_time[DK_NDRIVE];
                     60:        long    dk_wds[DK_NDRIVE];
                     61:        long    dk_seek[DK_NDRIVE];
                     62:        long    dk_xfer[DK_NDRIVE];
                     63:        float   dk_mspw[DK_NDRIVE];
                     64:        long    tk_nin;
                     65:        long    tk_nout;
                     66: } s, s1;
                     67: 
                     68: int    mf;
                     69: int    hz;
                     70: double etime;
                     71: 
                     72: main(argc, argv)
                     73: char *argv[];
                     74: {
                     75:        extern char *ctime();
                     76:        register  i;
                     77:        int iter;
                     78:        double f1, f2;
                     79:        long t;
                     80:        int tohdr = 1;
                     81: 
                     82:        nlist("/vmunix", nl);
                     83:        if(nl[X_DK_BUSY].n_type == 0) {
                     84:                printf("dk_busy not found in /vmunix namelist\n");
                     85:                exit(1);
                     86:        }
                     87:        mf = open("/dev/kmem", 0);
                     88:        if(mf < 0) {
                     89:                printf("cannot open /dev/kmem\n");
                     90:                exit(1);
                     91:        }
                     92:        iter = 0;
                     93:        while (argc>1&&argv[1][0]=='-') {
                     94:                argc--;
                     95:                argv++;
                     96:        }
                     97:        lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
                     98:        read(mf, s.dk_mspw, sizeof s.dk_mspw);
                     99:        for (i = 0; i < DK_NDRIVE; i++)
                    100:                sprintf(dr_name[i], "dk%d", i);
                    101:        read_names();
                    102:        if(argc > 2)
                    103:                iter = atoi(argv[2]);
                    104: loop:
                    105:        if (--tohdr == 0) {
                    106:                printf("      tty");
                    107:                for (i = 0; i < DK_NDRIVE; i++)
                    108:                        if (s.dk_mspw[i] != 0.0)
                    109:                                printf("          %3.3s ", dr_name[i]);
                    110:                printf("         cpu\n");
                    111:                printf(" tin tout");
                    112:                for (i = 0; i < DK_NDRIVE; i++)
                    113:                        if (s.dk_mspw[i] != 0.0)
                    114:                                printf(" bps tps msps ");
                    115:                printf(" us ni sy id\n");
                    116:                tohdr = 19;
                    117:        }
                    118:        lseek(mf, (long)nl[X_DK_BUSY].n_value, 0);
                    119:        read(mf, &s.dk_busy, sizeof s.dk_busy);
                    120:        lseek(mf, (long)nl[X_DK_TIME].n_value, 0);
                    121:        read(mf, s.dk_time, sizeof s.dk_time);
                    122:        lseek(mf, (long)nl[X_DK_XFER].n_value, 0);
                    123:        read(mf, s.dk_xfer, sizeof s.dk_xfer);
                    124:        lseek(mf, (long)nl[X_DK_WDS].n_value, 0);
                    125:        read(mf, s.dk_wds, sizeof s.dk_wds);
                    126:        lseek(mf, (long)nl[X_TK_NIN].n_value, 0);
                    127:        read(mf, &s.tk_nin, sizeof s.tk_nin);
                    128:        lseek(mf, (long)nl[X_TK_NOUT].n_value, 0);
                    129:        read(mf, &s.tk_nout, sizeof s.tk_nout);
                    130:        lseek(mf, (long)nl[X_DK_SEEK].n_value, 0);
                    131:        read(mf, s.dk_seek, sizeof s.dk_seek);
                    132:        lseek(mf, (long)nl[X_CP_TIME].n_value, 0);
                    133:        read(mf, s.cp_time, sizeof s.cp_time);
                    134:        lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
                    135:        read(mf, s.dk_mspw, sizeof s.dk_mspw);
                    136:        lseek(mf, (long)nl[X_HZ].n_value, 0);
                    137:        read(mf, &hz, sizeof hz);
                    138:        for (i = 0; i < DK_NDRIVE; i++) {
                    139: #define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t
                    140:                X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time);
                    141:        }
                    142:        t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t;
                    143:        t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t;
                    144:        etime = 0;
                    145:        for(i=0; i<CPUSTATES; i++) {
                    146:                X(cp_time);
                    147:                etime += s.cp_time[i];
                    148:        }
                    149:        if (etime == 0.0)
                    150:                etime = 1.0;
                    151:        etime /= (float) hz;
                    152:        printf("%4.0f%5.0f", s.tk_nin/etime, s.tk_nout/etime);
                    153:        for (i=0; i<DK_NDRIVE; i++)
                    154:                if (s.dk_mspw[i] != 0.0)
                    155:                        stats(i);
                    156:        for (i=0; i<CPUSTATES; i++)
                    157:                stat1(i);
                    158:        printf("\n");
                    159: contin:
                    160:        --iter;
                    161:        if(iter)
                    162:        if(argc > 1) {
                    163:                sleep(atoi(argv[1]));
                    164:                goto loop;
                    165:        }
                    166: }
                    167: 
                    168: stats(dn)
                    169: {
                    170:        register i;
                    171:        double atime, words, xtime, itime;
                    172: 
                    173:        if (s.dk_mspw[dn] == 0.0) {
                    174:                printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0);
                    175:                return;
                    176:        }
                    177:        atime = s.dk_time[dn];
                    178:        atime /= (float) hz;
                    179:        words = s.dk_wds[dn]*32.0;      /* number of words transferred */
                    180:        xtime = s.dk_mspw[dn]*words;    /* transfer time */
                    181:        itime = atime - xtime;          /* time not transferring */
                    182: /*
                    183:        printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n",
                    184:            dn, words, atime, xtime, itime);
                    185: */
                    186:        if (xtime < 0)
                    187:                itime += xtime, xtime = 0;
                    188:        if (itime < 0)
                    189:                xtime += itime, itime = 0;
                    190:        printf("%4.0f", words/512/etime);
                    191:        printf("%4.0f", s.dk_xfer[dn]/etime);
                    192:        printf("%5.1f ",
                    193:            s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0);
                    194: /*
                    195:        printf("%4.1f",
                    196:            s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0);
                    197: */
                    198: }
                    199: 
                    200: stat1(o)
                    201: {
                    202:        register i;
                    203:        double time;
                    204: 
                    205:        time = 0;
                    206:        for(i=0; i<CPUSTATES; i++)
                    207:                time += s.cp_time[i];
                    208:        if (time == 0.0)
                    209:                time = 1.0;
                    210:        printf("%3.0f", 100*s.cp_time[o]/time);
                    211: }
                    212: 
                    213: #define steal(where, var) lseek(mf, where, 0); read(mf, &var, sizeof var);
                    214: 
                    215: #ifdef vax
                    216: read_names()
                    217: {
                    218:        struct mba_device mdev;
                    219:        register struct mba_device *mp;
                    220:        struct mba_driver mdrv;
                    221:        short two_char;
                    222:        char *cp = (char *) &two_char;
                    223:        struct uba_device udev, *up;
                    224:        struct uba_driver udrv;
                    225: 
                    226:        mp = (struct mba_device *) nl[X_MBDINIT].n_value;
                    227:        up = (struct uba_device *) nl[X_UBDINIT].n_value;
                    228:        if (up == 0)
                    229:        {
                    230:                fprintf(stderr, "iostat: Disk init info not in namelist\n");
                    231:                exit(1);
                    232:        }
                    233:        if (mp) for (;;) {
                    234:                steal(mp++, mdev);
                    235:                if (mdev.mi_driver == 0)
                    236:                        break;
                    237:                if (mdev.mi_dk < 0 || mdev.mi_alive == 0)
                    238:                        continue;
                    239:                steal(mdev.mi_driver, mdrv);
                    240:                steal(mdrv.md_dname, two_char);
                    241:                sprintf(dr_name[mdev.mi_dk], "%c%c%d", cp[0], cp[1], mdev.mi_unit);
                    242:        }
                    243:        if (up) for (;;) {
                    244:                steal(up++, udev);
                    245:                if (udev.ui_driver == 0)
                    246:                        break;
                    247:                if (udev.ui_dk < 0 || udev.ui_alive == 0)
                    248:                        continue;
                    249:                steal(udev.ui_driver, udrv);
                    250:                steal(udrv.ud_dname, two_char);
                    251:                sprintf(dr_name[udev.ui_dk], "%c%c%d", cp[0], cp[1], udev.ui_unit);
                    252:        }
                    253: }
                    254: #endif
                    255: 
                    256: #ifdef sun
                    257: read_names()
                    258: {
                    259:        struct mb_device mdev;
                    260:        register struct mb_device *mp;
                    261:        struct mb_driver mdrv;
                    262:        short two_char;
                    263:        char *cp = (char *) &two_char;
                    264: 
                    265:        mp = (struct mb_device *) nl[X_MBDINIT].n_value;
                    266:        if (mp == 0) {
                    267:                fprintf(stderr, "iostat: Disk init info not in namelist\n");
                    268:                exit(1);
                    269:        }
                    270:        for (;;) {
                    271:                steal(mp++, mdev);
                    272:                if (mdev.md_driver == 0)
                    273:                        break;
                    274:                if (mdev.md_dk < 0 || mdev.md_alive == 0)
                    275:                        continue;
                    276:                steal(mdev.md_driver, mdrv);
                    277:                steal(mdrv.mdr_dname, two_char);
                    278:                sprintf(dr_name[mdev.md_dk], "%c%c%d", cp[0], cp[1], mdev.md_unit);
                    279:        }
                    280: }
                    281: #endif

unix.superglobalmegacorp.com

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