=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/systat/iostat.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- src/usr.bin/systat/iostat.c 1996/03/27 19:32:54 1.2 +++ src/usr.bin/systat/iostat.c 1996/05/22 11:35:34 1.3 @@ -1,5 +1,4 @@ -/* $OpenBSD: iostat.c,v 1.2 1996/03/27 19:32:54 niklas Exp $ */ -/* $NetBSD: iostat.c,v 1.4 1996/03/15 22:19:25 ragge Exp $ */ +/* $NetBSD: iostat.c,v 1.5 1996/05/10 23:16:35 thorpej Exp $ */ /* * Copyright (c) 1980, 1992, 1993 @@ -37,14 +36,14 @@ #ifndef lint #if 0 static char sccsid[] = "@(#)iostat.c 8.1 (Berkeley) 6/6/93"; -static char rcsid[] = "$NetBSD: iostat.c,v 1.4 1996/03/15 22:19:25 ragge Exp $"; #endif -static char rcsid[] = "$OpenBSD: iostat.c,v 1.2 1996/03/27 19:32:54 niklas Exp $"; +static char rcsid[] = "$NetBSD: iostat.c,v 1.5 1996/05/10 23:16:35 thorpej Exp $"; #endif not lint #include #include #include +#include #include #include @@ -53,39 +52,13 @@ #include "systat.h" #include "extern.h" -static struct nlist namelist[] = { -#define X_DK_BUSY 0 - { "_dk_busy" }, -#define X_DK_TIME 1 - { "_dk_time" }, -#define X_DK_XFER 2 - { "_dk_xfer" }, -#define X_DK_WDS 3 - { "_dk_wds" }, -#define X_DK_SEEK 4 - { "_dk_seek" }, -#define X_CP_TIME 5 - { "_cp_time" }, -#ifdef tahoe -#define X_VBDINIT (X_CP_TIME+1) - { "_vbdinit" }, -#endif - { "" }, -}; +#include "dkstats.h" +extern struct _disk cur; -static struct { - int dk_busy; - long cp_time[CPUSTATES]; - long *dk_time; - long *dk_wds; - long *dk_seek; - long *dk_xfer; -} s, s1; - static int linesperregion; static double etime; static int numbers = 0; /* default display bar graphs */ -static int msps = 0; /* default ms/seek shown */ +static int secs = 0; /* default seconds shown */ static int barlabels __P((int)); static void histogram __P((double, int, double)); @@ -114,42 +87,16 @@ int initiostat() { - if (namelist[X_DK_BUSY].n_type == 0) { - if (kvm_nlist(kd, namelist)) { - nlisterr(namelist); - return(0); - } - if (namelist[X_DK_BUSY].n_type == 0) { - error("Disk init information isn't in namelist"); - return(0); - } - } - if (! dkinit()) - return(0); - if (dk_ndrive) { -#define allocate(e, t) \ - s./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \ - s1./**/e = (t *)calloc(dk_ndrive, sizeof (t)); - allocate(dk_time, long); - allocate(dk_wds, long); - allocate(dk_seek, long); - allocate(dk_xfer, long); -#undef allocate - } - return(1); + dkinit(1); + dkreadstats(); } void fetchiostat() { - if (namelist[X_DK_BUSY].n_type == 0) + if (dk_ndrive == 0) return; - NREAD(X_DK_BUSY, &s.dk_busy, LONG); - NREAD(X_DK_TIME, s.dk_time, dk_ndrive * LONG); - NREAD(X_DK_XFER, s.dk_xfer, dk_ndrive * LONG); - NREAD(X_DK_WDS, s.dk_wds, dk_ndrive * LONG); - NREAD(X_DK_SEEK, s.dk_seek, dk_ndrive * LONG); - NREAD(X_CP_TIME, s.cp_time, sizeof s.cp_time); + dkreadstats(); } #define INSET 10 @@ -159,8 +106,8 @@ { int row; - if (namelist[X_DK_BUSY].n_type == 0) { - error("No dk_busy defined."); + if (dk_ndrive == 0) { + error("No drives defined."); return; } row = 0; @@ -187,7 +134,7 @@ #define COLWIDTH 14 #define DRIVESPERLINE ((wnd->maxx - INSET) / COLWIDTH) for (ndrives = 0, i = 0; i < dk_ndrive; i++) - if (dk_select[i]) + if (cur.dk_select[i]) ndrives++; regions = howmany(ndrives, DRIVESPERLINE); /* @@ -202,14 +149,14 @@ linesperregion = 3; col = 0; for (i = 0; i < dk_ndrive; i++) - if (dk_select[i] && dk_mspw[i] != 0.0) { + if (cur.dk_select[i] /*&& cur.dk_bytes[i] != 0.0*/) { if (col + COLWIDTH >= wnd->maxx - INSET) { col = 0, row += linesperregion + 1; if (row > wnd->maxy - (linesperregion + 1)) break; } - mvwaddstr(wnd, row, col + 4, dr_name[i]); - mvwaddstr(wnd, row + 1, col, "bps tps msps"); + mvwaddstr(wnd, row, col + 4, cur.dk_name[i]); + mvwaddstr(wnd, row + 1, col, "Kps tps sec"); col += COLWIDTH; } if (col) @@ -224,16 +171,16 @@ int i; mvwaddstr(wnd, row++, INSET, - "/0 /5 /10 /15 /20 /25 /30 /35 /40 /45 /50"); - linesperregion = 2 + msps; + "/0 /10 /20 /30 /40 /50 /60 /70 /80 /90 /100"); + linesperregion = 2 + secs; for (i = 0; i < dk_ndrive; i++) - if (dk_select[i] && dk_mspw[i] != 0.0) { + if (cur.dk_select[i] /*&& cur.dk_bytes[i] != 0.0*/) { if (row > wnd->maxy - linesperregion) break; - mvwprintw(wnd, row++, 0, "%3.3s bps|", dr_name[i]); + mvwprintw(wnd, row++, 0, "%3.3s Kps|", cur.dk_name[i]); mvwaddstr(wnd, row++, 0, " tps|"); - if (msps) - mvwaddstr(wnd, row++, 0, " msps|"); + if (secs) + mvwaddstr(wnd, row++, 0, " msec|"); } return (row); } @@ -242,19 +189,16 @@ void showiostat() { - register long t; + register u_int64_t t; register int i, row, col; - if (namelist[X_DK_BUSY].n_type == 0) + if (dk_ndrive == 0) return; - for (i = 0; i < dk_ndrive; i++) { -#define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t - X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time); - } + dkswap(); + etime = 0; for(i = 0; i < CPUSTATES; i++) { - X(cp_time); - etime += s.cp_time[i]; + etime += cur.cp_time[i]; } if (etime == 0.0) etime = 1.0; @@ -269,7 +213,7 @@ if (!numbers) { row += 2; for (i = 0; i < dk_ndrive; i++) - if (dk_select[i] && dk_mspw[i] != 0.0) { + if (cur.dk_select[i] /*&& cur.dk_bytes[i] != 0.0*/) { if (row > wnd->maxy - linesperregion) break; row = stats(row, INSET, i); @@ -282,7 +226,7 @@ wmove(wnd, row + 3, 0); winsertln(wnd); for (i = 0; i < dk_ndrive; i++) - if (dk_select[i] && dk_mspw[i] != 0.0) { + if (cur.dk_select[i] /*&& cur.dk_bytes[i] != 0.0*/) { if (col + COLWIDTH >= wnd->maxx) { col = 0, row += linesperregion + 1; if (row > wnd->maxy - (linesperregion + 1)) @@ -301,31 +245,26 @@ stats(row, col, dn) int row, col, dn; { - double atime, words, xtime, itime; + double atime, words; - atime = s.dk_time[dn]; - atime /= (float) hz; - words = s.dk_wds[dn]*32.0; /* number of words transferred */ - xtime = dk_mspw[dn]*words; /* transfer time */ - itime = atime - xtime; /* time not transferring */ - if (xtime < 0) - itime += xtime, xtime = 0; - if (itime < 0) - xtime += itime, itime = 0; + /* time busy in disk activity */ + atime = (double)cur.dk_time[dn].tv_sec + + ((double)cur.dk_time[dn].tv_usec / (double)1000000); + + words = cur.dk_bytes[dn] / 1024.0; /* # of K transferred */ if (numbers) { mvwprintw(wnd, row, col, "%3.0f%4.0f%5.1f", - words / 512 / etime, s.dk_xfer[dn] / etime, - s.dk_seek[dn] ? itime * 1000. / s.dk_seek[dn] : 0.0); + words / etime, cur.dk_xfer[dn] / etime, atime / etime); return (row); } wmove(wnd, row++, col); - histogram(words / 512 / etime, 50, 1.0); + histogram(words / etime, 50, 0.5); wmove(wnd, row++, col); - histogram(s.dk_xfer[dn] / etime, 50, 1.0); - if (msps) { + histogram(cur.dk_xfer[dn] / etime, 50, 0.5); + if (secs) { wmove(wnd, row++, col); - histogram(s.dk_seek[dn] ? itime * 1000. / s.dk_seek[dn] : 0, - 50, 1.0); + atime *= 1000; /* In milliseconds */ + histogram(atime / etime, 50, 0.5); } return (row); } @@ -339,12 +278,12 @@ time = 0; for (i = 0; i < CPUSTATES; i++) - time += s.cp_time[i]; + time += cur.cp_time[i]; if (time == 0.0) time = 1.0; wmove(wnd, row, INSET); #define CPUSCALE 0.5 - histogram(100.0 * s.cp_time[o] / time, 50, CPUSCALE); + histogram(100.0 * cur.cp_time[o] / time, 50, CPUSCALE); } static void @@ -364,6 +303,7 @@ while (k--) waddch(wnd, 'X'); waddstr(wnd, buf); + wclrtoeol(wnd); return; } while (k--) @@ -376,8 +316,8 @@ char *cmd, *args; { - if (prefix(cmd, "msps")) - msps = !msps; + if (prefix(cmd, "secs")) + secs = !secs; else if (prefix(cmd, "numbers")) numbers = 1; else if (prefix(cmd, "bars"))