Return to BSD News archive
Path: sserve!manuel!munnari.oz.au!uunet!usc!sdd.hp.com!think.com!cayman!brad From: brad@cuba.cayman (Brad Parker) Newsgroups: comp.unix.bsd Subject: iostat & wd.c (small patch) Message-ID: <BRAD.92Sep6134203@cuba.cayman> Date: 6 Sep 92 17:42:03 GMT Sender: news@cayman.COM Organization: You must be kidding... Lines: 250 Nntp-Posting-Host: cuba I was curious how my two IDE drives where doing under 386BSD, so I added missing support for some kernel globals used by iostat. I also changed the stock net2 iostat to report "kbytes" like sunos. I did not get "msps" (ms per seek) working since I don't know how to eastimate the "words per second" rate of an IDE drive. The calculation seems a bit hokey to me anyway i.e. busy_time - known_xfer_rate_per_wds*words_xfered -> "seek" overhead This seems like an "interesting" number but I don't get how to calculate the known xfer rate since this is highly cpu dependant for a non-dma IDE controller (right?). If I'm lost or clueless on this, please send me a note. I'm not very IDE literate. I verifed the resulting numbers with a little test program and a known MS-DOS disk speed checker. I got between 300kbytes/sec and 900kbytes/sec depending on the size of the "userland" i/o request (this, to the raw device, of course). -brad diff -c -r1.2 wd.c *** /tmp/,RCSt1000115 Sun Sep 6 13:27:01 1992 --- wd.c Sun Sep 6 10:22:41 1992 *************** *** 54,59 **** --- 54,60 ---- #include "uio.h" #include "malloc.h" #include "machine/cpu.h" + #include "sys/dkstat.h" #include "i386/isa/isa_device.h" #include "i386/isa/icu.h" #include "i386/isa/wdreg.h" *************** *** 430,435 **** --- 431,444 ---- wdtab.b_active = 1; /* mark controller active */ wdc = du->dk_port; + /* instrumentation */ + if (du->dk_unit >= 0 && du->dk_skip == 0) { + dk_busy |= 1 << du->dk_unit; + ++dk_seek[du->dk_unit]; + ++dk_xfer[du->dk_unit]; + dk_wds[du->dk_unit] += bp->b_bcount >> 6; + } + /* if starting a multisector transfer, or doing single transfers */ if (du->dk_skip == 0 || (du->dk_flags & DKFL_SINGLE)) { if (wdtab.b_errcnt && (bp->b_flags & B_READ) == 0) *************** *** 598,603 **** --- 607,616 ---- wdxfer[du->dk_unit]++; if (wdtab.b_active) { + + if (du->dk_unit >= 0) + dk_busy &=~ (1 << du->dk_unit); + if ((bp->b_flags & B_ERROR) == 0) { du->dk_skip++; /* Add to successful sectors. */ if (wdtab.b_errcnt && (du->dk_flags & DKFL_QUIET) == 0) diff -c -r1.1 iostat.c *** /tmp/,RCSt1000121 Sun Sep 6 13:27:50 1992 --- iostat.c Sun Sep 6 11:01:56 1992 *************** *** 311,317 **** (void)printf(" cpu\n tin tout"); for (i = 0; i < dk_ndrive; i++) if (dr_select[i]) ! (void)printf(" sps tps msps "); (void)printf(" us ni sy id\n"); } --- 311,317 ---- (void)printf(" cpu\n tin tout"); for (i = 0; i < dk_ndrive; i++) if (dr_select[i]) ! (void)printf(" bps tps msps "); (void)printf(" us ni sy id\n"); } *************** *** 324,333 **** for (dn = 0; dn < dk_ndrive; ++dn) { if (!dr_select[dn]) continue; ! words = cur.dk_wds[dn] * 32; /* words xfer'd */ ! (void)printf("%4.0f", /* sectors */ ! words / (DEV_BSIZE / 2) / etime); (void)printf("%4.0f", cur.dk_xfer[dn] / etime); if (dk_wpms[dn] && cur.dk_xfer[dn]) { --- 324,334 ---- for (dn = 0; dn < dk_ndrive; ++dn) { if (!dr_select[dn]) continue; ! words = cur.dk_wds[dn] * 32; /* words = 32*64 byte xfer's */ ! (void)printf("%4.0f", /* kbytes/second */ ! (words / 512) / etime); + /* transfers/second */ (void)printf("%4.0f", cur.dk_xfer[dn] / etime); if (dk_wpms[dn] && cur.dk_xfer[dn]) { *************** *** 342,347 **** --- 343,357 ---- } else msps = 0; (void)printf("%5.1f ", msps); + + #ifdef DEBUG + if (dn == 1) { + printf("\nwords %.2f, dk_wpms %d\n", + words, dk_wpms[dn]); + printf("etime %.2f, atime %.2f, xtime %.2f, itime %.2f\n", + etime, atime, xtime, itime); + } + #endif } } Return-Path: root@faster Delivery-Date: Sun, 06 Sep 92 13:28:39 -0400 Return-Path: root@faster Return-Path: <root@faster> Received: from faster by stemwinder (4.1/SMI-4.1) id AA02174; Sun, 6 Sep 92 13:28:38 EDT Received: by faster (AA00143); Sun, 6 Sep 92 13:30:49 -0400 Date: Sun, 6 Sep 92 13:30:49 -0400 From: Charlie Root <root@faster> Message-Id: <9209061730.AA00143@faster> To: brad@stemwinder diff -c -r1.2 wd.c *** /tmp/,RCSt1000115 Sun Sep 6 13:27:01 1992 --- wd.c Sun Sep 6 10:22:41 1992 *************** *** 54,59 **** --- 54,60 ---- #include "uio.h" #include "malloc.h" #include "machine/cpu.h" + #include "sys/dkstat.h" #include "i386/isa/isa_device.h" #include "i386/isa/icu.h" #include "i386/isa/wdreg.h" *************** *** 430,435 **** --- 431,444 ---- wdtab.b_active = 1; /* mark controller active */ wdc = du->dk_port; + /* instrumentation */ + if (du->dk_unit >= 0 && du->dk_skip == 0) { + dk_busy |= 1 << du->dk_unit; + ++dk_seek[du->dk_unit]; + ++dk_xfer[du->dk_unit]; + dk_wds[du->dk_unit] += bp->b_bcount >> 6; + } + /* if starting a multisector transfer, or doing single transfers */ if (du->dk_skip == 0 || (du->dk_flags & DKFL_SINGLE)) { if (wdtab.b_errcnt && (bp->b_flags & B_READ) == 0) *************** *** 598,603 **** --- 607,616 ---- wdxfer[du->dk_unit]++; if (wdtab.b_active) { + + if (du->dk_unit >= 0) + dk_busy &=~ (1 << du->dk_unit); + if ((bp->b_flags & B_ERROR) == 0) { du->dk_skip++; /* Add to successful sectors. */ if (wdtab.b_errcnt && (du->dk_flags & DKFL_QUIET) == 0) diff -c -r1.1 iostat.c *** /tmp/,RCSt1000121 Sun Sep 6 13:27:50 1992 --- iostat.c Sun Sep 6 11:01:56 1992 *************** *** 311,317 **** (void)printf(" cpu\n tin tout"); for (i = 0; i < dk_ndrive; i++) if (dr_select[i]) ! (void)printf(" sps tps msps "); (void)printf(" us ni sy id\n"); } --- 311,317 ---- (void)printf(" cpu\n tin tout"); for (i = 0; i < dk_ndrive; i++) if (dr_select[i]) ! (void)printf(" bps tps msps "); (void)printf(" us ni sy id\n"); } *************** *** 324,333 **** for (dn = 0; dn < dk_ndrive; ++dn) { if (!dr_select[dn]) continue; ! words = cur.dk_wds[dn] * 32; /* words xfer'd */ ! (void)printf("%4.0f", /* sectors */ ! words / (DEV_BSIZE / 2) / etime); (void)printf("%4.0f", cur.dk_xfer[dn] / etime); if (dk_wpms[dn] && cur.dk_xfer[dn]) { --- 324,334 ---- for (dn = 0; dn < dk_ndrive; ++dn) { if (!dr_select[dn]) continue; ! words = cur.dk_wds[dn] * 32; /* words = 32*64 byte xfer's */ ! (void)printf("%4.0f", /* kbytes/second */ ! (words / 512) / etime); + /* transfers/second */ (void)printf("%4.0f", cur.dk_xfer[dn] / etime); if (dk_wpms[dn] && cur.dk_xfer[dn]) { *************** *** 342,347 **** --- 343,357 ---- } else msps = 0; (void)printf("%5.1f ", msps); + + #ifdef DEBUG + if (dn == 1) { + printf("\nwords %.2f, dk_wpms %d\n", + words, dk_wpms[dn]); + printf("etime %.2f, atime %.2f, xtime %.2f, itime %.2f\n", + etime, atime, xtime, itime); + } + #endif } } -- A metaphor is like a simile. Brad Parker Cayman Systems, Inc., Cambridge, Ma. brad@cayman.com