Annotation of researchv10no/cmd/iostat.c, revision 1.1

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

unix.superglobalmegacorp.com

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