Annotation of cci/usr/src/usr.bin/iostat.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * iostat
        !             3:  */
        !             4: #include <curses.h>
        !             5: #include <signal.h>
        !             6: #include <stdio.h>
        !             7: #include <nlist.h>
        !             8: #include <sys/types.h>
        !             9: #include <sys/buf.h>
        !            10: #include <sys/dk.h>
        !            11: #include <vba/vbavar.h>
        !            12: #include <vba/vddc.h>
        !            13: 
        !            14: struct nlist nli[] = {
        !            15:        { "_dk_busy" },
        !            16: #define        X_DK_BUSY       0
        !            17:        { "_dk_time" },
        !            18: #define        X_DK_TIME       1
        !            19:        { "_dk_xfer" },
        !            20: #define        X_DK_XFER       2
        !            21:        { "_dk_wds" },
        !            22: #define        X_DK_WDS        3
        !            23:        { "_tk_nin" },
        !            24: #define        X_TK_NIN        4
        !            25:        { "_tk_nout" },
        !            26: #define        X_TK_NOUT       5
        !            27:        { "_dk_seek" },
        !            28: #define        X_DK_SEEK       6
        !            29:        { "_cp_time" },
        !            30: #define        X_CP_TIME       7
        !            31:        { "_dk_mspw" },
        !            32: #define        X_DK_MSPW       8
        !            33:        { "_hz" },
        !            34: #define        X_HZ            9
        !            35:        { "_vbdinit" },
        !            36: #define X_VBDINIT      10
        !            37:        { "_vdst" },
        !            38: #define X_VDST         11
        !            39:        { "_nvddrv" },
        !            40: #define X_NVDDRV       12
        !            41:        { 0 },
        !            42: };
        !            43: 
        !            44: char dr_name[DK_NDRIVE][10];
        !            45: 
        !            46: fs_tab *vdinfo,*vdinfo_save;
        !            47: long   name;
        !            48: 
        !            49: struct
        !            50: {
        !            51:        int     dk_busy;
        !            52:        long    cp_time[CPUSTATES];
        !            53:        long    dk_time[DK_NDRIVE];
        !            54:        long    dk_wds[DK_NDRIVE];
        !            55:        long    dk_seek[DK_NDRIVE];
        !            56:        long    dk_xfer[DK_NDRIVE];
        !            57:        float   dk_mspw[DK_NDRIVE];
        !            58:        long    tk_nin;
        !            59:        long    tk_nout;
        !            60: } s, s1;
        !            61: 
        !            62: #define        CPUSTE  4
        !            63: #define        NCOLS   80
        !            64: #define        NLINES  24
        !            65: #define        MAXRPT  4
        !            66: #define        UNIX    "/vmunix"
        !            67: 
        !            68: struct
        !            69: {
        !            70:        float   tin;
        !            71:        float   tout;
        !            72:        float   syste[CPUSTE];
        !            73:        float   bps[DK_NDRIVE];
        !            74:        float   tps[DK_NDRIVE];
        !            75:        float   msps[DK_NDRIVE];
        !            76: } rec[MAXRPT];
        !            77: 
        !            78: int    mf;
        !            79: int    hz;
        !            80: int    nodktyp;
        !            81: int    count,repcnt, iter;
        !            82: 
        !            83: double etime;
        !            84: extern char *malloc();
        !            85: 
        !            86: main(argc, argv)
        !            87: char *argv[];
        !            88: {
        !            89:        extern char *ctime();
        !            90:        register  i;
        !            91:        int iter;
        !            92:        int     j, totrep;
        !            93:        double f1, f2;
        !            94:        long t;
        !            95:        int     beg_i, end_i,head,hd;
        !            96:        int tohdr = 1;
        !            97:        int die();
        !            98:        int dietty();
        !            99:        int ptoutput();
        !           100:        int shiftarray();
        !           101:        int     TERM;
        !           102:        
        !           103:        TERM = isatty(1);
        !           104:        nlist(UNIX, nli);
        !           105:        if(nli[X_DK_BUSY].n_value == 0) {
        !           106:                printf("dk_busy not found in %s namelist\n",UNIX);
        !           107:                exit(1);
        !           108:        }
        !           109:        mf = open("/dev/kmem", 0);
        !           110:        if(mf < 0) {
        !           111:                printf("cannot open /dev/kmem\n");
        !           112:                exit(1);
        !           113:        }
        !           114:        while (argc>1&&argv[1][0]=='-') {
        !           115:                argc--;
        !           116:                argv++;
        !           117:        }
        !           118:        lseek(mf, (long)nli[X_DK_MSPW].n_value, 0);
        !           119:        read(mf, s.dk_mspw, sizeof s.dk_mspw);
        !           120:        for (i = 0; i < DK_NDRIVE; i++)
        !           121:                sprintf (dr_name[i],"??%x",i);
        !           122:        lseek(mf, (long)nli[X_NVDDRV].n_value, 0);
        !           123:        read(mf, &nodktyp, sizeof nodktyp);
        !           124:        vdinfo = (fs_tab *)malloc(nodktyp*sizeof(fs_tab));
        !           125:        lseek(mf, (long)nli[X_VDST].n_value, 0);
        !           126:        read(mf, (char *)vdinfo, nodktyp*sizeof(fs_tab));
        !           127:        vdinfo_save = vdinfo;
        !           128:        for (i = 0; i < nodktyp; vdinfo++, i++) {
        !           129:                name = (long)vdinfo->type_name;
        !           130:                vdinfo->type_name = malloc(3);
        !           131:                lseek(mf, (long)name, 0);
        !           132:                read(mf, vdinfo->type_name, 3);
        !           133:        }
        !           134:        vdinfo = vdinfo_save;
        !           135:        read_names();  
        !           136: 
        !           137:        totrep = 1;
        !           138:        if(argc > 2)
        !           139:                totrep = atoi(argv[2]);
        !           140:        if (argc ==2)
        !           141:                totrep = -1;
        !           142:        iter = 0;
        !           143:        if ((totrep < 0) || (totrep > MAXRPT))
        !           144:                repcnt = MAXRPT;
        !           145:        else
        !           146:                repcnt = totrep;
        !           147:        if (TERM){
        !           148:                initscr();
        !           149:                signal(SIGINT,dietty);
        !           150:                nonl();
        !           151:                crmode();
        !           152:                noecho();
        !           153:                leaveok(stdscr, TRUE);
        !           154:                scrollok(stdscr,FALSE);
        !           155:        }
        !           156:        else
        !           157:                signal(SIGINT,die);
        !           158: loop:
        !           159:        head = 4;
        !           160:        end_i = 0;
        !           161:        hd=0;
        !           162:        lseek(mf, (long)nli[X_DK_BUSY].n_value, 0);
        !           163:        read(mf, &s.dk_busy, sizeof s.dk_busy);
        !           164:        lseek(mf, (long)nli[X_DK_TIME].n_value, 0);
        !           165:        read(mf, s.dk_time, sizeof s.dk_time);
        !           166:        lseek(mf, (long)nli[X_DK_XFER].n_value, 0);
        !           167:        read(mf, s.dk_xfer, sizeof s.dk_xfer);
        !           168:        lseek(mf, (long)nli[X_DK_WDS].n_value, 0);
        !           169:        read(mf, s.dk_wds, sizeof s.dk_wds);
        !           170:        lseek(mf, (long)nli[X_TK_NIN].n_value, 0);
        !           171:        read(mf, &s.tk_nin, sizeof s.tk_nin);
        !           172:        lseek(mf, (long)nli[X_TK_NOUT].n_value, 0);
        !           173:        read(mf, &s.tk_nout, sizeof s.tk_nout);
        !           174:        lseek(mf, (long)nli[X_DK_SEEK].n_value, 0);
        !           175:        read(mf, s.dk_seek, sizeof s.dk_seek);
        !           176:        lseek(mf, (long)nli[X_CP_TIME].n_value, 0);
        !           177:        read(mf, s.cp_time, sizeof s.cp_time);
        !           178:        lseek(mf, (long)nli[X_DK_MSPW].n_value, 0);
        !           179:        read(mf, s.dk_mspw, sizeof s.dk_mspw);
        !           180:        lseek(mf, (long)nli[X_HZ].n_value, 0);
        !           181:        read(mf, &hz, sizeof hz);
        !           182:        for (i = 0; i < DK_NDRIVE; i++) {
        !           183: #define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t
        !           184:                X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time);
        !           185:        }
        !           186:        t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t;
        !           187:        t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t;
        !           188:        etime = 0;
        !           189:        for(i=0; i<CPUSTATES; i++) {
        !           190:                X(cp_time);
        !           191:                etime += s.cp_time[i];
        !           192:        }
        !           193:        if (etime == 0.0)
        !           194:                etime = 1.0;
        !           195:        etime /= (float) hz;
        !           196:        rec[iter].tin = s.tk_nin/etime;
        !           197:        rec[iter].tout = s.tk_nout/etime;
        !           198:        for (i=0; i<DK_NDRIVE; i++){
        !           199:                if(dr_name[i][0] != '?'){
        !           200:                        stats(i,iter);
        !           201:                }
        !           202:        }
        !           203:        for (i=0; i<CPUSTATES; i++)
        !           204:                stat1(i,iter);
        !           205:        count++;
        !           206: prt_loop:
        !           207:        beg_i = hd;
        !           208:        if (TERM) {
        !           209:                if (head == 4)
        !           210:                        printw(" tty  tin tout     cpu    us ni sy id     "); 
        !           211:                for (i = hd; i < DK_NDRIVE; i++){ 
        !           212:                        if (dr_name[i][0] != '?'){
        !           213:                                printw("          %3.3s ",dr_name[i]); 
        !           214:                                head++;
        !           215:                                if ((head % 5 )== 0)
        !           216:                                        break;
        !           217:                        }
        !           218:                }
        !           219:                if (head !=5 )
        !           220:                        printw ("\n");
        !           221:                if (i == DK_NDRIVE)
        !           222:                        i--;
        !           223:                end_i = i;
        !           224:                for (i = beg_i; i <= end_i; i++)
        !           225:                        if(dr_name[i][0] != '?')
        !           226:                                printw(" bps tps  msps");
        !           227:                printw ("\n");
        !           228:                for(i = 0; i < (iter+1); i++){
        !           229:                        if (head == 5){
        !           230:                                printw("     %4.0f%5.0f           ",rec[i].tin,rec[i].tout);
        !           231:                                for (j = 0; j < CPUSTE; j++)
        !           232:                                        printw("%3.0f",rec[i].syste[j]);
        !           233:                                printw("                   ");
        !           234:                        }       
        !           235:                        for (j = beg_i; j <= end_i; j++)
        !           236:                                if (dr_name[j][0] != '?')
        !           237:                                printw("%4.0f%4.0f %5.1f",
        !           238:                                  rec[i].bps[j], rec[i].tps[j],
        !           239:                                  rec[i].msps[j]);
        !           240:                        printw ("\n");
        !           241:                }
        !           242:                for(i=(iter+1); i<repcnt; i++)
        !           243:                        printw("\n");
        !           244:                if (end_i < (DK_NDRIVE-1) ){
        !           245:                        hd = end_i+1;
        !           246:                        goto prt_loop;
        !           247:                }
        !           248:                refresh();
        !           249:                move(0,0);     
        !           250:        }
        !           251:        else
        !           252:             if ((count >= MAXRPT) &&( (count % MAXRPT ) == 0))
        !           253:                        ptoutput(iter+1);
        !           254: 
        !           255:        if (totrep > 0 )
        !           256:                totrep--;
        !           257:        iter++;
        !           258: 
        !           259:        if (count >=  MAXRPT ){
        !           260:                for(i=0; i < (MAXRPT -1); i++){
        !           261:                        shiftarray(i,1);
        !           262:                }
        !           263:                iter = MAXRPT-1;
        !           264:        }
        !           265: /*
        !           266: 
        !           267:        if (count >= MAXRPT) {
        !           268:                for(i = 0; i < (MAXRPT-1); i ++){
        !           269:                        rec[i].tin = rec[i+1].tin;
        !           270:                        rec[i].tout = rec[i+1].tout;
        !           271:                        for(j=0; j < CPUSTATES; j++)
        !           272:                                rec[i].syste[j] = rec[i+1].syste[j];
        !           273:                        for(j=0; j< DK_NDRIVE; j++){
        !           274:                                rec[i].bps[j] =rec[i+1].bps[j];
        !           275:                                rec[i].tps[j] =rec[i+1].tps[j];
        !           276:                                rec[i].msps[j] =rec[i+1].msps[j];
        !           277:                        }
        !           278:                }
        !           279:        iter = MAXRPT -1;
        !           280:        }
        !           281: */
        !           282: 
        !           283:        if (totrep != 0 ){
        !           284:                if(argc > 1) {
        !           285:                        sleep(atoi(argv[1]));     
        !           286:                        goto loop;
        !           287:                }
        !           288:        }
        !           289:        if(TERM)
        !           290:                dietty();
        !           291:        else
        !           292:                die();
        !           293: }
        !           294: 
        !           295: stats(dn,cnt)
        !           296: {
        !           297:        register i;
        !           298:        double atime, words, xtime, itime;
        !           299: /*
        !           300:        if (s.dk_mspw[dn] == 0.0) {
        !           301:                rec[cnt].bps[dn] = 0.0;
        !           302:                rec[cnt].tps[dn] = 0.0; 
        !           303:                rec[cnt].msps[dn] = 0.0;
        !           304:                return;
        !           305:        }
        !           306: */
        !           307:        atime = s.dk_time[dn];
        !           308:        atime /= (float) hz;
        !           309:        words = s.dk_wds[dn]*32.0;      /* number of words transferred */
        !           310:        xtime = s.dk_mspw[dn]*words;    /* transfer time */
        !           311:        itime = atime - xtime;          /* time not transferring */
        !           312:        if (xtime < 0)
        !           313:                itime += xtime, xtime = 0;
        !           314:        if (itime < 0)
        !           315:                xtime += itime, itime = 0;
        !           316:        rec[cnt].bps[dn] = words/512/etime;
        !           317:        rec[cnt].tps[dn] = s.dk_xfer[dn]/etime; 
        !           318:        rec[cnt].msps[dn] = s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0;
        !           319: }
        !           320: 
        !           321: stat1(o,ict)
        !           322: {
        !           323:        register i;
        !           324:        double time;
        !           325: 
        !           326:        time = 0;
        !           327:        for(i=0; i<CPUSTATES; i++)
        !           328:                time += s.cp_time[i];
        !           329:        if (time == 0.0)
        !           330:                time = 1.0;
        !           331:        rec[ict].syste[o] = 100*s.cp_time[o]/time;
        !           332: }
        !           333: 
        !           334: #define steal(where, var) lseek(mf, where, 0); read(mf, &var, sizeof var);
        !           335: 
        !           336: read_names()
        !           337: {
        !           338:        struct vba_device udev, *up;
        !           339:        struct vba_driver udrv;
        !           340:        int     unit, i;
        !           341: 
        !           342:        up = (struct vba_device *) nli[X_VBDINIT].n_value;
        !           343:        if (up == 0)
        !           344:        {
        !           345:                fprintf(stderr, "iostat: Disk init info not in namelist\n");
        !           346:                exit(1);
        !           347:        }
        !           348:        vdinfo_save = vdinfo;
        !           349:        for (;;) {
        !           350:                steal(up++, udev);
        !           351:                 if (udev.ui_driver == 0)
        !           352:                        break;
        !           353:                if (udev.ui_dk <= 0 || udev.ui_alive == 0)
        !           354:                        continue;
        !           355:                unit = (udev.ui_ctlr * 4) + udev.ui_slave;
        !           356:                if(udev.ui_type >= nodktyp){
        !           357:                        fprintf(stderr,"iostat : disk type in unit %d not supported \n",unit);
        !           358:                        exit(1);
        !           359:                }
        !           360:                vdinfo = vdinfo_save;
        !           361:                for(i=0; i < udev.ui_type; i++)
        !           362:                        vdinfo++;
        !           363:                dr_name[unit][0] = vdinfo->type_name[0];
        !           364:                dr_name[unit][1] = vdinfo->type_name[1];
        !           365:        }
        !           366: }
        !           367: die()
        !           368: {
        !           369:        int     i,j,k;
        !           370:        iter--;
        !           371:        signal(SIGINT,SIG_IGN);
        !           372:        i = count % MAXRPT;
        !           373:        if (count >= MAXRPT){
        !           374:                k = MAXRPT - i;
        !           375:                for (j=0; j <i; j++)
        !           376:                        shiftarray(0,k);
        !           377:        }
        !           378:        ptoutput(i);
        !           379:        exit(0);
        !           380: }
        !           381: dietty()
        !           382: {
        !           383:        signal(SIGINT, SIG_IGN);
        !           384:        mvcur(0,COLS-1, LINES-1,0);
        !           385:        endwin();
        !           386:        exit(0);
        !           387: }
        !           388: ptoutput(reptot)
        !           389:        int reptot;
        !           390: {
        !           391: register       i,j;
        !           392: int    doneflg,head,end_i,beg_i;
        !           393:        head = 4;
        !           394:        beg_i = 0;
        !           395:        doneflg=0;
        !           396:        printf(" tty  tin tout     cpu    us ni sy id     "); 
        !           397:        while (!doneflg){
        !           398:          for (i = beg_i; i < DK_NDRIVE; i++){ 
        !           399:                if (dr_name[i][0] != '?'){
        !           400:                        printf("          %3.3s ",dr_name[i]); 
        !           401:                        head++;
        !           402:                        if ((head % 5 )== 0)
        !           403:                                break;
        !           404:                }
        !           405:          }
        !           406:          if (head !=5 )
        !           407:                        printf ("\n");
        !           408:          if (i == DK_NDRIVE){
        !           409:                i--;
        !           410:                doneflg++;
        !           411:                }
        !           412:          end_i = i;
        !           413:          for (i = beg_i; i <= end_i; i++)
        !           414:                if(dr_name[i][0] != '?')
        !           415:                        printf(" bps tps  msps");
        !           416:          printf ("\n");
        !           417:          for(i = 0; i < reptot; i++){
        !           418:                if (head == 5){
        !           419:                        printf("     %4.0f%5.0f           ",
        !           420:                               rec[i].tin,rec[i].tout);
        !           421:                        for (j = 0; j < CPUSTE; j++)
        !           422:                                printf("%3.0f",rec[i].syste[j]);
        !           423:                        printf("                   ");
        !           424:                }
        !           425:                for (j = beg_i; j <= end_i; j++)
        !           426:                        if (dr_name[j][0] != '?'){
        !           427:                              printf("%4.0f%4.0f %5.1f", rec[i].bps[j],
        !           428:                              rec[i].tps[j],rec[i].msps[j]);
        !           429:                        }
        !           430:                printf ("\n");
        !           431:          }
        !           432:          for(i=reptot; i<repcnt; i++)
        !           433:                        printf("\n");
        !           434:        beg_i = end_i;
        !           435:        }
        !           436: }
        !           437: shiftarray(srtary,offset)
        !           438:        int     srtary; /* starting array to be shifted */
        !           439:        int     offset; /* offset to be skip in shifting array  */ 
        !           440: {
        !           441: register       j;
        !           442:        rec[srtary].tin = rec[srtary+offset].tin;
        !           443:        rec[srtary].tout = rec[srtary+offset].tout;
        !           444:        for(j=0; j < CPUSTATES; j++)
        !           445:                rec[srtary].syste[j] = rec[srtary+offset].syste[j];
        !           446:        for(j=0; j< DK_NDRIVE; j++){
        !           447:                rec[srtary].bps[j] =rec[srtary+offset].bps[j];
        !           448:                rec[srtary].tps[j] =rec[srtary+offset].tps[j];
        !           449:                rec[srtary].msps[j] =rec[srtary+offset].msps[j];
        !           450:        }
        !           451: }

unix.superglobalmegacorp.com

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