Annotation of 42BSD/usr.bin/iostat.c, revision 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.