Annotation of researchv8dc/cmd/iostat/oiostat.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * iostat
                      3:  */
                      4: #include <nlist.h>
                      5: #include <sys/dk.h>
                      6: #include "/usr/sys/h/param.h"
                      7: /* this is a botch, fix sys/buf.h */
                      8: #define KERNEL
                      9: #include "/usr/sys/h/buf.h"
                     10: 
                     11: struct nlist nl[] = {
                     12:        { "_dk_busy" },
                     13: #define        X_DK_BUSY       0
                     14:        { "_dk_time" },
                     15: #define        X_DK_TIME       1
                     16:        { "_dk_xfer" },
                     17: #define        X_DK_XFER       2
                     18:        { "_dk_wds" },
                     19: #define        X_DK_WDS        3
                     20:        { "_tk_nin" },
                     21: #define        X_TK_NIN        4
                     22:        { "_tk_nout" },
                     23: #define        X_TK_NOUT       5
                     24:        { "_dk_seek" },
                     25: #define        X_DK_SEEK       6
                     26:        { "_cp_time" },
                     27: #define        X_CP_TIME       7
                     28:        { "_dk_mspw" },
                     29: #define        X_DK_MSPW       8
                     30:        { "_io_info" },
                     31: #define X_DK_INFO      9
                     32:        { "_io_wait" },
                     33: #define X_IO_WAIT      10
                     34:        { 0 },
                     35: };
                     36: struct
                     37: {
                     38:        int     dk_busy;
                     39:        long    cp_time[CPUSTATES];
                     40:        long    dk_time[DK_NDRIVE];
                     41:        long    dk_wds[DK_NDRIVE];
                     42:        long    dk_seek[DK_NDRIVE];
                     43:        long    dk_xfer[DK_NDRIVE];
                     44:        float   dk_mspw[DK_NDRIVE];
                     45:        struct  {
                     46:                int nbuf;
                     47:                long nread, nreada, ncache, nwrite;
                     48:                long whyread[W_LAST+1], whycache[W_LAST+1];
                     49:        } io_info;
                     50:        long    io_wait;
                     51:        long    tk_nin;
                     52:        long    tk_nout;
                     53: } s, s1;
                     54: 
                     55: int    mf;
                     56: double etime;
                     57: 
                     58: main(argc, argv)
                     59: char *argv[];
                     60: {
                     61:        extern char *ctime();
                     62:        register  i;
                     63:        int iter;
                     64:        double f1, f2;
                     65:        long t;
                     66:        int tohdr = 1;
                     67: 
                     68:        nlist("/vmunix", nl);
                     69:        if(nl[X_DK_BUSY].n_type == 0) {
                     70:                printf("dk_busy not found in /vmunix namelist\n");
                     71:                exit(1);
                     72:        }
                     73:        mf = open("/dev/kmem", 0);
                     74:        if(mf < 0) {
                     75:                printf("cannot open /dev/kmem\n");
                     76:                exit(1);
                     77:        }
                     78:        iter = 0;
                     79:        while (argc>1&&argv[1][0]=='-') {
                     80:                argc--;
                     81:                argv++;
                     82:        }
                     83:        lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
                     84:        read(mf, s.dk_mspw, sizeof s.dk_mspw);
                     85:        if(argc > 2)
                     86:                iter = atoi(argv[2]);
                     87: loop:
                     88:        if (--tohdr == 0) {
                     89:                for (i = 0; i < DK_NDRIVE; i++)
                     90:                        if (s.dk_mspw[i] != 0.0)
                     91:                                printf("           D%d ", i);
                     92:                printf("         CPU\n");
                     93:                for (i = 0; i < DK_NDRIVE; i++)
                     94:                        if (s.dk_mspw[i] != 0.0)
                     95:                                printf(" sps tps msps ");
                     96:                printf(" us ni sy id wt\trd\trda\tch\twrt\n");
                     97:                tohdr = 9;
                     98:        }
                     99:        lseek(mf, (long)nl[X_DK_BUSY].n_value, 0);
                    100:        read(mf, &s.dk_busy, sizeof s.dk_busy);
                    101:        lseek(mf, (long)nl[X_DK_TIME].n_value, 0);
                    102:        read(mf, s.dk_time, sizeof s.dk_time);
                    103:        lseek(mf, (long)nl[X_DK_XFER].n_value, 0);
                    104:        read(mf, s.dk_xfer, sizeof s.dk_xfer);
                    105:        lseek(mf, (long)nl[X_DK_WDS].n_value, 0);
                    106:        read(mf, s.dk_wds, sizeof s.dk_wds);
                    107:        lseek(mf, (long)nl[X_TK_NIN].n_value, 0);
                    108:        read(mf, &s.tk_nin, sizeof s.tk_nin);
                    109:        lseek(mf, (long)nl[X_TK_NOUT].n_value, 0);
                    110:        read(mf, &s.tk_nout, sizeof s.tk_nout);
                    111:        lseek(mf, (long)nl[X_DK_SEEK].n_value, 0);
                    112:        read(mf, s.dk_seek, sizeof s.dk_seek);
                    113:        lseek(mf, (long)nl[X_CP_TIME].n_value, 0);
                    114:        read(mf, s.cp_time, sizeof s.cp_time);
                    115:        lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
                    116:        read(mf, s.dk_mspw, sizeof s.dk_mspw);
                    117:        lseek(mf, (long)nl[X_DK_INFO].n_value, 0);
                    118:        read(mf, (char *)&s.io_info, sizeof s.io_info);
                    119:        lseek(mf, (long)nl[X_IO_WAIT].n_value, 0);
                    120:        read(mf, (char *)&s.io_wait, sizeof s.io_wait);
                    121: #define sv(x)  t = s.x; s.x -= s1.x; s1.x = t;
                    122:        for (i = 0; i < DK_NDRIVE; i++) {
                    123:                sv(dk_xfer[i]); sv(dk_seek[i]); sv(dk_wds[i]); sv(dk_time[i]);
                    124:        }
                    125:        sv(tk_nin);
                    126:        sv(tk_nout);
                    127:        sv(io_info.nread);
                    128:        sv(io_info.nreada);
                    129:        sv(io_info.ncache);
                    130:        sv(io_info.nwrite);
                    131:        sv(io_wait);
                    132:        for(i = 0; i <= W_LAST; i++) {
                    133:                sv(io_info.whyread[i]);
                    134:                sv(io_info.whycache[i]);
                    135:        }
                    136:        etime = 0;
                    137:        for(i=0; i<CPUSTATES; i++) {
                    138:                sv(cp_time[i]);
                    139:                etime += s.cp_time[i];
                    140:        }
                    141:        if (etime == 0.0)
                    142:                etime = 1.0;
                    143:        etime /= 60.0;
                    144:        for (i=0; i<DK_NDRIVE; i++)
                    145:                if (s.dk_mspw[i] != 0.0)
                    146:                        stats(i);
                    147:        for (i=0; i<CPUSTATES; i++)
                    148:                stat1(i);
                    149:        printf("%3.0f", s.io_wait*100./60./etime);
                    150:        printf("\t%d\t%d\t%d\t%d", s.io_info.nread, s.io_info.nreada,
                    151:                s.io_info.ncache, s.io_info.nwrite);
                    152:        printf("\n");
                    153: #define        W_FREE  1
                    154: #define W_INODE        2
                    155: #define W_INDIR 3
                    156: #define W_SUPER 4
                    157: #define W_DATA 5
                    158: #define W_EXEC 6
                    159: #define W_BADDR 7
                    160: #define W_DIREC        8
                    161: #define W_LAST 8
                    162: #define xpr(n,i) printf("%ld,%ld:%s ",s.io_info.whyread[i], s.io_info.whycache[i],n);
                    163:        xpr("f", 1); xpr("ino", 2); xpr("ind", 3); xpr("s", 4);
                    164:        xpr("d", 5); xpr("x", 6); xpr("v", 7); xpr("dir", 8);
                    165:        printf("\n");
                    166: contin:
                    167:        --iter;
                    168:        if(iter)
                    169:        if(argc > 1) {
                    170:                sleep(atoi(argv[1]));
                    171:                goto loop;
                    172:        }
                    173: }
                    174: 
                    175: stats(dn)
                    176: {
                    177:        register i;
                    178:        double atime, words, xtime, itime;
                    179: 
                    180:        if (s.dk_mspw[dn] == 0.0) {
                    181:                printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0);
                    182:                return;
                    183:        }
                    184:        atime = s.dk_time[dn];
                    185:        atime /= 60.0;
                    186:        words = s.dk_wds[dn]*32.0;      /* number of words transferred */
                    187:        xtime = s.dk_mspw[dn]*words;    /* transfer time */
                    188:        itime = atime - xtime;          /* time not transferring */
                    189: /*
                    190:        printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n",
                    191:            dn, words, atime, xtime, itime);
                    192: */
                    193:        if (xtime < 0)
                    194:                itime += xtime, xtime = 0;
                    195:        if (itime < 0)
                    196:                xtime += itime, itime = 0;
                    197:        printf("%4.0f", s.dk_seek[dn]/etime);
                    198:        printf("%4.0f", s.dk_xfer[dn]/etime);
                    199:        printf("%5.1f ",
                    200:            s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0);
                    201: /*
                    202:        printf("%4.1f",
                    203:            s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0);
                    204: */
                    205: }
                    206: 
                    207: stat1(o)
                    208: {
                    209:        register i;
                    210:        double time;
                    211: 
                    212:        time = 0;
                    213:        for(i=0; i<CPUSTATES; i++)
                    214:                time += s.cp_time[i];
                    215:        if (time == 0.0)
                    216:                time = 1.0;
                    217:        printf("%3.0f", 100*s.cp_time[o]/time);
                    218: }

unix.superglobalmegacorp.com

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