gnb@uunet.uu.net (Gregory Bond) (12/30/88)
We are evaluating different server configurations, and a plot of the output from iostat over a couple of "normal" days is part of the comparison. Users of the Ciprico Rimfire controller (3200/3400) will find that iostat command doesn't report stats for this controller. Enclosed is a patch to the rimfire device driver "rf.c" (v1.14) that makes iostat report the rimfire stats, and fixes some pretty ugly #if/#endif mismatches in the code. NB: USE AT YOUR OWN RISK! I am not a super experienced kernel hacker, but the results have run for a week or two with no problems, and the answers seem to be in the right ballpark. But then, who can tell... BTW: on a 3/260, a Rimfire+CDC SABRE V seems about 25-50% faster than a Xylogics 750+SABRE, which is itself about twice as fast as a Xylogics 451 with Fuji M-2333 drives. Your mileage (or kilometerage in the real world!) may vary. Disclaimer: I have no association with Ciprico or Xylogics except as a test site for a local distributor from whom we will probably buy the Rimfire sometime soon. -- Gregory Bond, Burdett Buckeridge & Young Ltd, Melbourne, Australia Internet: gnb@melba.bby.oz.au non-MX: gnb%melba.bby.oz@uunet.uu.net Uucp: {uunet,mnetor,pyramid,ubc-vision,ukc,mcvax,...}!munnari!melba.bby.oz!gnb ----X--- cut here *** ORIG_rf.c Thu Dec 8 15:32:15 1988 --- rf.c Tue Dec 20 16:19:42 1988 *************** *** 252,257 **** --- 252,259 ---- #include "../sundev/rferr.h" #include "../sundev/mbvar.h" + #define GNB /* Add gnb's code to make iostat work */ + /* Get a Direct Virtual Memory Address (DVMA) from a virtual kernel address */ #define RF_ADDR(x) ((int)((int)(x) & 0xfffff)) /* DVMA address (20 bits) */ *************** *** 296,302 **** /* Debugging aids */ ! #define DSKBUG /* comment this line out to run faster */ static int debuglevel = 0x00; /* all debug levels OFF */ #ifdef RFSTATS /* Statistic gathering information: */ --- 298,304 ---- /* Debugging aids */ ! /* #define DSKBUG /* comment this line out to run faster */ static int debuglevel = 0x00; /* all debug levels OFF */ #ifdef RFSTATS /* Statistic gathering information: */ *************** *** 389,394 **** --- 391,397 ---- int finished; /* save reset complete status */ static char tellem = 1; /* Identify driver for them just once 1.10b */ + #ifdef DSKBUG if (debuglevel&1) printf("rfprobe: controller %d at %x\n", unit, rf); #endif DSKBUG *************** *** 433,439 **** printf("rf: RF3200/RF3400 driver version 1.14\n"); tellem = 0; } - #ifdef DSKBUG return(sizeof(RF32REG)); } --- 436,441 ---- *************** *** 1085,1090 **** --- 1087,1101 ---- } } + #ifdef GNB + /* Assume it's OK -> add to dk info for iostat */ + if (device->md_dk >= 0 && device->md_dk < DK_NDRIVE) { /* Is OK */ + /* bytes/sec = bytes/sector * rev/sec * nsectors */ + /* interleave = 1 */ + dk_bps[device->md_dk] = DEV_BSIZE * 60 * gp->dkg_nsect; + } + #endif GNB + /* release resources */ rmfree(iopbmap, sizeof(EXTPB), (caddr_t)xpb); return(1); *************** *** 1544,1549 **** --- 1555,1569 ---- /* tell upper half we are done */ iodone(bp); + #ifdef GNB + if(!nqbuf[controller]) { /* Mark drive inactive */ + register int dk = rfdrive_info[unit]->md_dk; + + if (dk >= 0 && dk < DK_NDRIVE) { + dk_busy &= ~(1 << dk); + } + } + #endif } /* command complete */ } /* while there are status blocks to process */ *************** *** 3457,3462 **** --- 3477,3490 ---- /* we think for perfmeter */ if(device->md_dk >= 0) dk_xfer[device->md_dk]++; + #ifdef GNB + if ((i = device->md_dk) >= 0) { + dk_busy |= 1 << i; + dk_seek[i]++; + dk_wds[i] += pb->blkcount << 3; /* 64 byte chunks? */ + } + #endif + ((RF32REG *) device->md_mc->mc_addr)->attention = SWAB(HOST_ID); #ifdef DSKBUG if (debuglevel & 1) {