summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorgibbs <gibbs@FreeBSD.org>1998-09-15 08:15:30 +0000
committergibbs <gibbs@FreeBSD.org>1998-09-15 08:15:30 +0000
commit1bb65e0d8a28cf476487e517d8b682254d70de95 (patch)
treea8383a03e6bea653e6b5a6659e3f681d88f5f11c /sys
parent6eb110bd6840eb7af7100261e50705539c5206fc (diff)
downloadFreeBSD-src-1bb65e0d8a28cf476487e517d8b682254d70de95.zip
FreeBSD-src-1bb65e0d8a28cf476487e517d8b682254d70de95.tar.gz
Update system to new device statistics code.
Submitted by: "Kenneth D. Merry" <ken@plutotech.com> mike@smith.net.au (Mike Smith)
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ccd/ccd.c66
-rw-r--r--sys/dev/fdc/fdc.c50
-rw-r--r--sys/geom/geom_ccd.c66
-rw-r--r--sys/i386/isa/fd.c50
-rw-r--r--sys/i386/isa/wcd.c20
-rw-r--r--sys/i386/isa/wd.c75
-rw-r--r--sys/i386/isa/wfd.c23
-rw-r--r--sys/isa/fd.c50
-rw-r--r--sys/pc98/pc98/wfd.c23
9 files changed, 211 insertions, 212 deletions
diff --git a/sys/dev/ccd/ccd.c b/sys/dev/ccd/ccd.c
index 9e9e399..8280fd5 100644
--- a/sys/dev/ccd/ccd.c
+++ b/sys/dev/ccd/ccd.c
@@ -1,4 +1,4 @@
-/* $Id: ccd.c,v 1.35 1998/07/04 22:30:13 julian Exp $ */
+/* $Id: ccd.c,v 1.36 1998/08/19 10:50:32 sos Exp $ */
/* $NetBSD: ccd.c,v 1.22 1995/12/08 19:13:26 thorpej Exp $ */
@@ -103,6 +103,7 @@
#include <sys/disklabel.h>
#include <ufs/ffs/fs.h>
#include <sys/device.h>
+#include <sys/devicestat.h>
#undef KERNEL /* XXX */
#include <sys/disk.h>
#define KERNEL
@@ -292,9 +293,6 @@ ccdinit(ccd, cpaths, p)
printf("ccdinit: unit %d\n", ccd->ccd_unit);
#endif
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- cs->sc_dk = ccd->ccd_dk;
-#endif
cs->sc_size = 0;
cs->sc_ileave = ccd->ccd_interleave;
cs->sc_nccdisks = ccd->ccd_ndev;
@@ -481,10 +479,12 @@ ccdinit(ccd, cpaths, p)
ccg->ccg_nsectors = 1024 * (1024 / ccg->ccg_secsize);
ccg->ccg_ncylinders = cs->sc_size / ccg->ccg_nsectors;
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- if (ccd->ccd_dk >= 0)
- dk_wpms[ccd->ccd_dk] = 32 * (60 * DEV_BSIZE / 2); /* XXX */
-#endif
+ /*
+ * Add an devstat entry for this device.
+ */
+ devstat_add_entry(&cs->device_stats, "ccd", ccd->ccd_unit,
+ ccg->ccg_secsize, DEVSTAT_ALL_SUPPORTED,
+ DEVSTAT_TYPE_ASC0 |DEVSTAT_TYPE_IF_OTHER);
cs->sc_flags |= CCDF_INITED;
cs->sc_cflags = ccd->ccd_flags; /* So we can find out later... */
@@ -776,17 +776,8 @@ ccdstart(cs, bp)
printf("ccdstart(%x, %x)\n", cs, bp);
#endif
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- /*
- * Instrumentation (not very meaningful)
- */
- cs->sc_nactive++;
- if (cs->sc_dk >= 0) {
- dk_busy |= 1 << cs->sc_dk;
- dk_xfer[cs->sc_dk]++;
- dk_wds[cs->sc_dk] += bp->b_bcount >> 6;
- }
-#endif
+ /* Record the transaction start */
+ devstat_start_transaction(&cs->device_stats);
/*
* Translate the partition-relative block number to an absolute.
@@ -909,6 +900,7 @@ ccdbuffer(cb, cs, bp, bn, addr, bcount)
cbp->cb_buf.b_data = addr;
cbp->cb_buf.b_vp = ci->ci_vp;
LIST_INIT(&cbp->cb_buf.b_dep);
+ cbp->cb_buf.b_resid = 0;
if (cs->sc_ileave == 0)
cbp->cb_buf.b_bcount = dbtob(ci->ci_size - cbn);
else
@@ -963,16 +955,14 @@ ccdintr(cs, bp)
/*
* Request is done for better or worse, wakeup the top half.
*/
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- --cs->sc_nactive;
-#ifdef DIAGNOSTIC
- if (cs->sc_nactive < 0)
- panic("ccdintr: ccd%d: sc_nactive < 0", cs->sc_unit);
-#endif
+ /* Record device statistics */
+ devstat_end_transaction(&cs->device_stats,
+ bp->b_bcount - bp->b_resid,
+ (bp->b_flags & B_ORDERED) ?
+ DEVSTAT_TAG_ORDERED : DEVSTAT_TAG_SIMPLE,
+ (bp->b_flags & B_READ) ? DEVSTAT_READ :
+ DEVSTAT_WRITE);
- if (cs->sc_nactive == 0 && cs->sc_dk >= 0)
- dk_busy &= ~(1 << cs->sc_dk);
-#endif
if (bp->b_flags & B_ERROR)
bp->b_resid = bp->b_bcount;
biodone(bp);
@@ -1055,9 +1045,6 @@ ccdioctl(dev, cmd, data, flag, p)
struct ccddevice ccd;
char **cpp;
struct vnode **vpp;
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- extern int dkn;
-#endif
if (unit >= numccd)
return (ENXIO);
@@ -1143,27 +1130,10 @@ ccdioctl(dev, cmd, data, flag, p)
ccd.ccd_vpp = vpp;
ccd.ccd_ndev = ccio->ccio_ndisks;
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- /*
- * Assign disk index first so that init routine
- * can use it (saves having the driver drag around
- * the ccddevice pointer just to set up the dk_*
- * info in the open routine).
- */
- if (dkn < DK_NDRIVE)
- ccd.ccd_dk = dkn++;
- else
- ccd.ccd_dk = -1;
-#endif
-
/*
* Initialize the ccd. Fills in the softc for us.
*/
if (error = ccdinit(&ccd, cpp, p)) {
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- if (ccd.ccd_dk >= 0)
- --dkn;
-#endif
for (j = 0; j < lookedup; ++j)
(void)vn_close(vpp[j], FREAD|FWRITE,
p->p_ucred, p);
diff --git a/sys/dev/fdc/fdc.c b/sys/dev/fdc/fdc.c
index b0b2442..8c6a2d6 100644
--- a/sys/dev/fdc/fdc.c
+++ b/sys/dev/fdc/fdc.c
@@ -43,7 +43,7 @@
* SUCH DAMAGE.
*
* from: @(#)fd.c 7.4 (Berkeley) 5/25/91
- * $Id: fd.c,v 1.120 1998/07/29 13:00:40 bde Exp $
+ * $Id: fd.c,v 1.121 1998/09/14 19:56:39 sos Exp $
*
*/
@@ -66,12 +66,10 @@
#include <machine/ioctl_fd.h>
#include <sys/disklabel.h>
#include <sys/buf.h>
+#include <sys/devicestat.h>
#include <sys/malloc.h>
#include <sys/proc.h>
#include <sys/syslog.h>
-#ifdef notyet
-#include <sys/dkstat.h>
-#endif
#include <i386/isa/isa.h>
#include <i386/isa/isa_device.h>
#include <i386/isa/fdreg.h>
@@ -174,11 +172,9 @@ static struct fd_data {
#define FD_NO_TRACK -2
int track; /* where we think the head is */
int options; /* user configurable options, see ioctl_fd.h */
-#ifdef notyet
- int dkunit; /* disk stats unit number */
-#endif
struct callout_handle toffhandle;
struct callout_handle tohandle;
+ struct devstat device_stats;
#ifdef DEVFS
void *bdevs[1 + NUMDENS + MAXPARTITIONS];
void *cdevs[1 + NUMDENS + MAXPARTITIONS];
@@ -793,18 +789,14 @@ fdattach(struct isa_device *dev)
"rfd%d%c", fdu, 'a' + i);
}
#endif /* DEVFS */
-#ifdef notyet
- if (dk_ndrive < DK_NDRIVE) {
- sprintf(dk_names[dk_ndrive], "fd%d", fdu);
- fd->dkunit = dk_ndrive++;
- /*
- * XXX assume rate is FDC_500KBPS.
- */
- dk_wpms[dk_ndrive] = 500000 / 8 / 2;
- } else {
- fd->dkunit = -1;
- }
-#endif
+ /*
+ * Export the drive to the devstat interface.
+ */
+ devstat_add_entry(&fd->device_stats, "fd",
+ fdu, 512,
+ DEVSTAT_NO_ORDERED_TAGS,
+ DEVSTAT_TYPE_FLOPPY | DEVSTAT_TYPE_IF_OTHER);
+
}
return (1);
@@ -1202,6 +1194,10 @@ fdstrategy(struct buf *bp)
s = splbio();
bufqdisksort(&fdc->head, bp);
untimeout(fd_turnoff, (caddr_t)fdu, fd->toffhandle); /* a good idea */
+
+ /* Tell devstat we are starting on the transaction */
+ devstat_start_transaction(&fd->device_stats);
+
fdstart(fdcu);
splx(s);
return;
@@ -1210,7 +1206,6 @@ bad:
biodone(bp);
}
-
/***************************************************************\
* fdstart *
* We have just queued something.. if the controller is not busy *
@@ -1627,6 +1622,12 @@ fdstate(fdcu_t fdcu, fdc_p fdc)
/* ALL DONE */
fd->skip = 0;
bufq_remove(&fdc->head, bp);
+ /* Tell devstat we have finished with the transaction */
+ devstat_end_transaction(&fd->device_stats,
+ bp->b_bcount - bp->b_resid,
+ DEVSTAT_TAG_NONE,
+ (bp->b_flags & B_READ) ?
+ DEVSTAT_READ : DEVSTAT_WRITE);
biodone(bp);
fdc->fd = (fd_p) 0;
fdc->fdu = -1;
@@ -1743,6 +1744,8 @@ retrier(fdcu)
struct subdev *sd;
fdc_p fdc = fdc_data + fdcu;
register struct buf *bp;
+ struct fd_data *fd;
+ int fdu;
bp = bufq_first(&fdc->head);
@@ -1789,6 +1792,13 @@ retrier(fdcu)
bp->b_error = EIO;
bp->b_resid += bp->b_bcount - fdc->fd->skip;
bufq_remove(&fdc->head, bp);
+
+ /* Tell devstat we have finished with the transaction */
+ devstat_end_transaction(&fd->device_stats,
+ bp->b_bcount - bp->b_resid,
+ DEVSTAT_TAG_NONE,
+ (bp->b_flags & B_READ) ? DEVSTAT_READ :
+ DEVSTAT_WRITE);
fdc->fd->skip = 0;
biodone(bp);
fdc->state = FINDWORK;
diff --git a/sys/geom/geom_ccd.c b/sys/geom/geom_ccd.c
index 9e9e399..8280fd5 100644
--- a/sys/geom/geom_ccd.c
+++ b/sys/geom/geom_ccd.c
@@ -1,4 +1,4 @@
-/* $Id: ccd.c,v 1.35 1998/07/04 22:30:13 julian Exp $ */
+/* $Id: ccd.c,v 1.36 1998/08/19 10:50:32 sos Exp $ */
/* $NetBSD: ccd.c,v 1.22 1995/12/08 19:13:26 thorpej Exp $ */
@@ -103,6 +103,7 @@
#include <sys/disklabel.h>
#include <ufs/ffs/fs.h>
#include <sys/device.h>
+#include <sys/devicestat.h>
#undef KERNEL /* XXX */
#include <sys/disk.h>
#define KERNEL
@@ -292,9 +293,6 @@ ccdinit(ccd, cpaths, p)
printf("ccdinit: unit %d\n", ccd->ccd_unit);
#endif
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- cs->sc_dk = ccd->ccd_dk;
-#endif
cs->sc_size = 0;
cs->sc_ileave = ccd->ccd_interleave;
cs->sc_nccdisks = ccd->ccd_ndev;
@@ -481,10 +479,12 @@ ccdinit(ccd, cpaths, p)
ccg->ccg_nsectors = 1024 * (1024 / ccg->ccg_secsize);
ccg->ccg_ncylinders = cs->sc_size / ccg->ccg_nsectors;
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- if (ccd->ccd_dk >= 0)
- dk_wpms[ccd->ccd_dk] = 32 * (60 * DEV_BSIZE / 2); /* XXX */
-#endif
+ /*
+ * Add an devstat entry for this device.
+ */
+ devstat_add_entry(&cs->device_stats, "ccd", ccd->ccd_unit,
+ ccg->ccg_secsize, DEVSTAT_ALL_SUPPORTED,
+ DEVSTAT_TYPE_ASC0 |DEVSTAT_TYPE_IF_OTHER);
cs->sc_flags |= CCDF_INITED;
cs->sc_cflags = ccd->ccd_flags; /* So we can find out later... */
@@ -776,17 +776,8 @@ ccdstart(cs, bp)
printf("ccdstart(%x, %x)\n", cs, bp);
#endif
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- /*
- * Instrumentation (not very meaningful)
- */
- cs->sc_nactive++;
- if (cs->sc_dk >= 0) {
- dk_busy |= 1 << cs->sc_dk;
- dk_xfer[cs->sc_dk]++;
- dk_wds[cs->sc_dk] += bp->b_bcount >> 6;
- }
-#endif
+ /* Record the transaction start */
+ devstat_start_transaction(&cs->device_stats);
/*
* Translate the partition-relative block number to an absolute.
@@ -909,6 +900,7 @@ ccdbuffer(cb, cs, bp, bn, addr, bcount)
cbp->cb_buf.b_data = addr;
cbp->cb_buf.b_vp = ci->ci_vp;
LIST_INIT(&cbp->cb_buf.b_dep);
+ cbp->cb_buf.b_resid = 0;
if (cs->sc_ileave == 0)
cbp->cb_buf.b_bcount = dbtob(ci->ci_size - cbn);
else
@@ -963,16 +955,14 @@ ccdintr(cs, bp)
/*
* Request is done for better or worse, wakeup the top half.
*/
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- --cs->sc_nactive;
-#ifdef DIAGNOSTIC
- if (cs->sc_nactive < 0)
- panic("ccdintr: ccd%d: sc_nactive < 0", cs->sc_unit);
-#endif
+ /* Record device statistics */
+ devstat_end_transaction(&cs->device_stats,
+ bp->b_bcount - bp->b_resid,
+ (bp->b_flags & B_ORDERED) ?
+ DEVSTAT_TAG_ORDERED : DEVSTAT_TAG_SIMPLE,
+ (bp->b_flags & B_READ) ? DEVSTAT_READ :
+ DEVSTAT_WRITE);
- if (cs->sc_nactive == 0 && cs->sc_dk >= 0)
- dk_busy &= ~(1 << cs->sc_dk);
-#endif
if (bp->b_flags & B_ERROR)
bp->b_resid = bp->b_bcount;
biodone(bp);
@@ -1055,9 +1045,6 @@ ccdioctl(dev, cmd, data, flag, p)
struct ccddevice ccd;
char **cpp;
struct vnode **vpp;
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- extern int dkn;
-#endif
if (unit >= numccd)
return (ENXIO);
@@ -1143,27 +1130,10 @@ ccdioctl(dev, cmd, data, flag, p)
ccd.ccd_vpp = vpp;
ccd.ccd_ndev = ccio->ccio_ndisks;
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- /*
- * Assign disk index first so that init routine
- * can use it (saves having the driver drag around
- * the ccddevice pointer just to set up the dk_*
- * info in the open routine).
- */
- if (dkn < DK_NDRIVE)
- ccd.ccd_dk = dkn++;
- else
- ccd.ccd_dk = -1;
-#endif
-
/*
* Initialize the ccd. Fills in the softc for us.
*/
if (error = ccdinit(&ccd, cpp, p)) {
-#ifdef WORKING_DISK_STATISTICS /* XXX !! */
- if (ccd.ccd_dk >= 0)
- --dkn;
-#endif
for (j = 0; j < lookedup; ++j)
(void)vn_close(vpp[j], FREAD|FWRITE,
p->p_ucred, p);
diff --git a/sys/i386/isa/fd.c b/sys/i386/isa/fd.c
index b0b2442..8c6a2d6 100644
--- a/sys/i386/isa/fd.c
+++ b/sys/i386/isa/fd.c
@@ -43,7 +43,7 @@
* SUCH DAMAGE.
*
* from: @(#)fd.c 7.4 (Berkeley) 5/25/91
- * $Id: fd.c,v 1.120 1998/07/29 13:00:40 bde Exp $
+ * $Id: fd.c,v 1.121 1998/09/14 19:56:39 sos Exp $
*
*/
@@ -66,12 +66,10 @@
#include <machine/ioctl_fd.h>
#include <sys/disklabel.h>
#include <sys/buf.h>
+#include <sys/devicestat.h>
#include <sys/malloc.h>
#include <sys/proc.h>
#include <sys/syslog.h>
-#ifdef notyet
-#include <sys/dkstat.h>
-#endif
#include <i386/isa/isa.h>
#include <i386/isa/isa_device.h>
#include <i386/isa/fdreg.h>
@@ -174,11 +172,9 @@ static struct fd_data {
#define FD_NO_TRACK -2
int track; /* where we think the head is */
int options; /* user configurable options, see ioctl_fd.h */
-#ifdef notyet
- int dkunit; /* disk stats unit number */
-#endif
struct callout_handle toffhandle;
struct callout_handle tohandle;
+ struct devstat device_stats;
#ifdef DEVFS
void *bdevs[1 + NUMDENS + MAXPARTITIONS];
void *cdevs[1 + NUMDENS + MAXPARTITIONS];
@@ -793,18 +789,14 @@ fdattach(struct isa_device *dev)
"rfd%d%c", fdu, 'a' + i);
}
#endif /* DEVFS */
-#ifdef notyet
- if (dk_ndrive < DK_NDRIVE) {
- sprintf(dk_names[dk_ndrive], "fd%d", fdu);
- fd->dkunit = dk_ndrive++;
- /*
- * XXX assume rate is FDC_500KBPS.
- */
- dk_wpms[dk_ndrive] = 500000 / 8 / 2;
- } else {
- fd->dkunit = -1;
- }
-#endif
+ /*
+ * Export the drive to the devstat interface.
+ */
+ devstat_add_entry(&fd->device_stats, "fd",
+ fdu, 512,
+ DEVSTAT_NO_ORDERED_TAGS,
+ DEVSTAT_TYPE_FLOPPY | DEVSTAT_TYPE_IF_OTHER);
+
}
return (1);
@@ -1202,6 +1194,10 @@ fdstrategy(struct buf *bp)
s = splbio();
bufqdisksort(&fdc->head, bp);
untimeout(fd_turnoff, (caddr_t)fdu, fd->toffhandle); /* a good idea */
+
+ /* Tell devstat we are starting on the transaction */
+ devstat_start_transaction(&fd->device_stats);
+
fdstart(fdcu);
splx(s);
return;
@@ -1210,7 +1206,6 @@ bad:
biodone(bp);
}
-
/***************************************************************\
* fdstart *
* We have just queued something.. if the controller is not busy *
@@ -1627,6 +1622,12 @@ fdstate(fdcu_t fdcu, fdc_p fdc)
/* ALL DONE */
fd->skip = 0;
bufq_remove(&fdc->head, bp);
+ /* Tell devstat we have finished with the transaction */
+ devstat_end_transaction(&fd->device_stats,
+ bp->b_bcount - bp->b_resid,
+ DEVSTAT_TAG_NONE,
+ (bp->b_flags & B_READ) ?
+ DEVSTAT_READ : DEVSTAT_WRITE);
biodone(bp);
fdc->fd = (fd_p) 0;
fdc->fdu = -1;
@@ -1743,6 +1744,8 @@ retrier(fdcu)
struct subdev *sd;
fdc_p fdc = fdc_data + fdcu;
register struct buf *bp;
+ struct fd_data *fd;
+ int fdu;
bp = bufq_first(&fdc->head);
@@ -1789,6 +1792,13 @@ retrier(fdcu)
bp->b_error = EIO;
bp->b_resid += bp->b_bcount - fdc->fd->skip;
bufq_remove(&fdc->head, bp);
+
+ /* Tell devstat we have finished with the transaction */
+ devstat_end_transaction(&fd->device_stats,
+ bp->b_bcount - bp->b_resid,
+ DEVSTAT_TAG_NONE,
+ (bp->b_flags & B_READ) ? DEVSTAT_READ :
+ DEVSTAT_WRITE);
fdc->fd->skip = 0;
biodone(bp);
fdc->state = FINDWORK;
diff --git a/sys/i386/isa/wcd.c b/sys/i386/isa/wcd.c
index 8c70750..1f22bfc 100644
--- a/sys/i386/isa/wcd.c
+++ b/sys/i386/isa/wcd.c
@@ -13,7 +13,7 @@
* all derivative works or modified versions.
*
* From: Version 1.9, Mon Oct 9 20:27:42 MSK 1995
- * $Id: wcd.c,v 1.57 1998/07/04 22:30:18 julian Exp $
+ * $Id: wcd.c,v 1.58 1998/09/08 20:57:47 sos Exp $
*/
#include "wdc.h"
@@ -29,6 +29,7 @@
#include <sys/proc.h>
#include <sys/malloc.h>
#include <sys/buf.h>
+#include <sys/devicestat.h>
#include <sys/disklabel.h>
#include <sys/cdio.h>
#include <sys/conf.h>
@@ -253,6 +254,7 @@ struct wcd {
char description[80]; /* Device description */
struct changer *changer_info; /* changer info */
int slot; /* this lun's slot number */
+ struct devstat device_stats; /* devstat parameters */
#ifdef DEVFS
void *ra_devfs_token;
void *rc_devfs_token;
@@ -328,6 +330,13 @@ wcd_init_lun(struct atapi *ata, int unit, struct atapi_params *ap, int lun)
DV_BLK, UID_ROOT, GID_OPERATOR, 0640,
"wcd%dc", lun);
#endif
+ /*
+ * Export the unit to the devstat interface.
+ */
+ devstat_add_entry(&ptr->device_stats, "wcd",
+ lun, SECSIZE,
+ DEVSTAT_NO_ORDERED_TAGS,
+ DEVSTAT_TYPE_CDROM | DEVSTAT_TYPE_IF_IDE);
return ptr;
}
@@ -637,6 +646,9 @@ static void wcd_start (struct wcd *t)
return;
}
+ /* Tell devstat we are starting on the transaction */
+ devstat_start_transaction(&t->device_stats);
+
wcd_select_slot(t);
/* We have a buf, now we should make a command
@@ -661,6 +673,12 @@ static void wcd_done (struct wcd *t, struct buf *bp, int resid,
bp->b_flags |= B_ERROR;
} else
bp->b_resid = resid;
+
+ /* Tell devstat we have finished with the transaction */
+ devstat_end_transaction(&t->device_stats,
+ bp->b_bcount - bp->b_resid,
+ DEVSTAT_TAG_NONE,
+ (bp->b_flags & B_READ) ? DEVSTAT_READ : DEVSTAT_WRITE);
biodone (bp);
wcd_start (t);
}
diff --git a/sys/i386/isa/wd.c b/sys/i386/isa/wd.c
index 63ce9f6..0e3027c 100644
--- a/sys/i386/isa/wd.c
+++ b/sys/i386/isa/wd.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)wd.c 7.2 (Berkeley) 5/9/91
- * $Id: wd.c,v 1.174 1998/08/23 20:16:34 phk Exp $
+ * $Id: wd.c,v 1.175 1998/09/14 19:56:39 sos Exp $
*/
/* TODO:
@@ -78,6 +78,7 @@
#include <sys/disklabel.h>
#include <sys/diskslice.h>
#include <sys/buf.h>
+#include <sys/devicestat.h>
#include <sys/malloc.h>
#ifdef DEVFS
#include <sys/devfsext.h>
@@ -90,7 +91,6 @@
#include <i386/isa/isa_device.h>
#include <i386/isa/wdreg.h>
#include <sys/syslog.h>
-#include <sys/dkstat.h>
#include <vm/vm.h>
#include <vm/vm_prot.h>
#include <vm/pmap.h>
@@ -187,12 +187,13 @@ struct disk {
*/
#define DKFL_LBA 0x02000 /* use LBA for data transfers */
struct wdparams dk_params; /* ESDI/IDE drive/controller parameters */
- int dk_dkunit; /* disk stats unit number */
unsigned int dk_multi; /* multi transfers */
- u_int dk_currentiosize; /* current io size */
+ int dk_currentiosize; /* current io size */
struct diskgeom dk_dd; /* device configuration data */
struct diskslices *dk_slices; /* virtual drives */
void *dk_dmacookie; /* handle for DMA services */
+
+ struct devstat dk_stats; /* devstat entry */
};
#define WD_COUNT_RETRIES
@@ -539,19 +540,14 @@ wdattach(struct isa_device *dvp)
"rwd%d", lunit);
#endif
- if (dk_ndrive < DK_NDRIVE) {
- sprintf(dk_names[dk_ndrive], "wd%d", lunit);
- /*
- * XXX we don't know the transfer rate of the
- * drive. Guess the maximum ISA rate of
- * 4MB/sec. `wpms' is words per _second_
- * according to iostat.
- */
- dk_wpms[dk_ndrive] = 4 * 1024 * 1024 / 2;
- du->dk_dkunit = dk_ndrive++;
- } else {
- du->dk_dkunit = -1;
- }
+ /*
+ * Export the drive to the devstat interface.
+ */
+ devstat_add_entry(&du->dk_stats, "wd",
+ lunit, du->dk_dd.d_secsize,
+ DEVSTAT_NO_ORDERED_TAGS,
+ DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_IDE);
+
} else {
free(du, M_TEMP);
wddrives[lunit] = NULL;
@@ -684,21 +680,8 @@ wdstrategy(register struct buf *bp)
#endif
wdstart(du->dk_ctrlr); /* start controller */
- if (du->dk_dkunit >= 0) {
- /*
- * XXX perhaps we should only count successful transfers.
- */
- dk_xfer[du->dk_dkunit]++;
- /*
- * XXX we can't count seeks correctly but we can do better
- * than this. E.g., assume that the geometry is correct
- * and count 1 seek if the starting cylinder of this i/o
- * differs from the starting cylinder of the previous i/o,
- * or count 1 seek if the starting bn of this i/o doesn't
- * immediately follow the ending bn of the previos i/o.
- */
- dk_seek[du->dk_dkunit]++;
- }
+ /* Tell devstat that we have started a transaction on this drive */
+ devstat_start_transaction(&du->dk_stats);
splx(s);
return;
@@ -951,9 +934,6 @@ wdstart(int ctrlr)
wdunwedge(du);
}
}
- if(du->dk_dkunit >= 0) {
- dk_busy |= 1 << du->dk_dkunit;
- }
if ((du->dk_flags & (DKFL_DMA|DKFL_SINGLE)) == DKFL_DMA) {
wddma[du->dk_interface].wdd_dmaprep(du->dk_dmacookie,
@@ -1041,16 +1021,6 @@ wdstart(int ctrlr)
(void *)((int)bp->b_data + du->dk_skip * DEV_BSIZE),
(count * DEV_BSIZE) / sizeof(short));
du->dk_bc -= DEV_BSIZE * count;
- if (du->dk_dkunit >= 0) {
- /*
- * `wd's are blocks of 32 16-bit `word's according to
- * iostat. dk_wds[] is the one disk i/o statistic that
- * we can record correctly.
- * XXX perhaps we shouldn't record words for failed
- * transfers.
- */
- dk_wds[du->dk_dkunit] += (count * DEV_BSIZE) >> 6;
- }
}
/* Interrupt routine for the controller. Acknowledge the interrupt, check for
@@ -1239,8 +1209,6 @@ oops:
chk += sizeof(short);
}
- if (du->dk_dkunit >= 0)
- dk_wds[du->dk_dkunit] += chk >> 6;
}
/* final cleanup on DMA */
@@ -1253,8 +1221,6 @@ oops:
du->dk_bc -= iosize;
- if (du->dk_dkunit >= 0)
- dk_wds[du->dk_dkunit] += iosize >> 6;
}
outt:
@@ -1294,11 +1260,14 @@ done: ;
bp->b_resid = bp->b_bcount - du->dk_skip * DEV_BSIZE;
wdutab[du->dk_lunit].b_active = 0;
du->dk_skip = 0;
- biodone(bp);
- }
- if(du->dk_dkunit >= 0) {
- dk_busy &= ~(1 << du->dk_dkunit);
+ /* Update device stats */
+ devstat_end_transaction(&du->dk_stats,
+ bp->b_bcount - bp->b_resid,
+ DEVSTAT_TAG_NONE,
+ (bp->b_flags & B_READ) ? DEVSTAT_READ : DEVSTAT_WRITE);
+
+ biodone(bp);
}
/* controller idle */
diff --git a/sys/i386/isa/wfd.c b/sys/i386/isa/wfd.c
index 560cfde..67d570a 100644
--- a/sys/i386/isa/wfd.c
+++ b/sys/i386/isa/wfd.c
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: wfd.c,v 1.14 1998/07/30 15:16:05 bde Exp $
+ * $Id: wfd.c,v 1.15 1998/08/23 20:16:34 phk Exp $
*/
/*
@@ -43,6 +43,7 @@
#include <sys/proc.h>
#include <sys/malloc.h>
#include <sys/buf.h>
+#include <sys/devicestat.h>
#include <sys/disklabel.h>
#include <sys/diskslice.h>
#include <sys/cdio.h>
@@ -141,6 +142,8 @@ struct wfd {
void *bdevs;
#endif
struct diskslices *dk_slices; /* virtual drives */
+
+ struct devstat device_stats;
};
static struct wfd *wfdtab[NUNIT]; /* Drive info by unit number */
@@ -263,6 +266,14 @@ wfdattach (struct atapi *ata, int unit, struct atapi_params *ap, int debug)
DV_CHR, UID_ROOT, GID_OPERATOR, 0640,
"rwfd%d", t->lun);
#endif /* DEVFS */
+
+ /*
+ * Export the drive to the devstat interface.
+ */
+ devstat_add_entry(&t->device_stats, "wfd",
+ wfdnlun, t->cap.sector_size,
+ DEVSTAT_NO_ORDERED_TAGS,
+ DEVSTAT_TYPE_FLOPPY | DEVSTAT_TYPE_IF_IDE);
return (1);
}
@@ -487,6 +498,9 @@ static void wfd_start (struct wfd *t)
/* Unqueue the request. */
bufq_remove(&t->buf_queue, bp);
+ /* Tell devstat we are starting on the transaction */
+ devstat_start_transaction(&t->device_stats);
+
/* We have a buf, now we should make a command
* First, translate the block to absolute and put it in terms of the
* logical blocksize of the device. */
@@ -574,6 +588,13 @@ static void wfd_done (struct wfd *t, struct buf *bp, int resid,
*/
if (((int)bp->b_driver1)-- <= 0) {
bp->b_resid = (int)bp->b_driver2;
+
+ /* Tell devstat we have finished with the transaction */
+ devstat_end_transaction(&t->device_stats,
+ bp->b_bcount - bp->b_resid,
+ DEVSTAT_TAG_NONE,
+ (bp->b_flags & B_READ) ? DEVSTAT_READ : DEVSTAT_WRITE);
+
biodone (bp);
}
diff --git a/sys/isa/fd.c b/sys/isa/fd.c
index b0b2442..8c6a2d6 100644
--- a/sys/isa/fd.c
+++ b/sys/isa/fd.c
@@ -43,7 +43,7 @@
* SUCH DAMAGE.
*
* from: @(#)fd.c 7.4 (Berkeley) 5/25/91
- * $Id: fd.c,v 1.120 1998/07/29 13:00:40 bde Exp $
+ * $Id: fd.c,v 1.121 1998/09/14 19:56:39 sos Exp $
*
*/
@@ -66,12 +66,10 @@
#include <machine/ioctl_fd.h>
#include <sys/disklabel.h>
#include <sys/buf.h>
+#include <sys/devicestat.h>
#include <sys/malloc.h>
#include <sys/proc.h>
#include <sys/syslog.h>
-#ifdef notyet
-#include <sys/dkstat.h>
-#endif
#include <i386/isa/isa.h>
#include <i386/isa/isa_device.h>
#include <i386/isa/fdreg.h>
@@ -174,11 +172,9 @@ static struct fd_data {
#define FD_NO_TRACK -2
int track; /* where we think the head is */
int options; /* user configurable options, see ioctl_fd.h */
-#ifdef notyet
- int dkunit; /* disk stats unit number */
-#endif
struct callout_handle toffhandle;
struct callout_handle tohandle;
+ struct devstat device_stats;
#ifdef DEVFS
void *bdevs[1 + NUMDENS + MAXPARTITIONS];
void *cdevs[1 + NUMDENS + MAXPARTITIONS];
@@ -793,18 +789,14 @@ fdattach(struct isa_device *dev)
"rfd%d%c", fdu, 'a' + i);
}
#endif /* DEVFS */
-#ifdef notyet
- if (dk_ndrive < DK_NDRIVE) {
- sprintf(dk_names[dk_ndrive], "fd%d", fdu);
- fd->dkunit = dk_ndrive++;
- /*
- * XXX assume rate is FDC_500KBPS.
- */
- dk_wpms[dk_ndrive] = 500000 / 8 / 2;
- } else {
- fd->dkunit = -1;
- }
-#endif
+ /*
+ * Export the drive to the devstat interface.
+ */
+ devstat_add_entry(&fd->device_stats, "fd",
+ fdu, 512,
+ DEVSTAT_NO_ORDERED_TAGS,
+ DEVSTAT_TYPE_FLOPPY | DEVSTAT_TYPE_IF_OTHER);
+
}
return (1);
@@ -1202,6 +1194,10 @@ fdstrategy(struct buf *bp)
s = splbio();
bufqdisksort(&fdc->head, bp);
untimeout(fd_turnoff, (caddr_t)fdu, fd->toffhandle); /* a good idea */
+
+ /* Tell devstat we are starting on the transaction */
+ devstat_start_transaction(&fd->device_stats);
+
fdstart(fdcu);
splx(s);
return;
@@ -1210,7 +1206,6 @@ bad:
biodone(bp);
}
-
/***************************************************************\
* fdstart *
* We have just queued something.. if the controller is not busy *
@@ -1627,6 +1622,12 @@ fdstate(fdcu_t fdcu, fdc_p fdc)
/* ALL DONE */
fd->skip = 0;
bufq_remove(&fdc->head, bp);
+ /* Tell devstat we have finished with the transaction */
+ devstat_end_transaction(&fd->device_stats,
+ bp->b_bcount - bp->b_resid,
+ DEVSTAT_TAG_NONE,
+ (bp->b_flags & B_READ) ?
+ DEVSTAT_READ : DEVSTAT_WRITE);
biodone(bp);
fdc->fd = (fd_p) 0;
fdc->fdu = -1;
@@ -1743,6 +1744,8 @@ retrier(fdcu)
struct subdev *sd;
fdc_p fdc = fdc_data + fdcu;
register struct buf *bp;
+ struct fd_data *fd;
+ int fdu;
bp = bufq_first(&fdc->head);
@@ -1789,6 +1792,13 @@ retrier(fdcu)
bp->b_error = EIO;
bp->b_resid += bp->b_bcount - fdc->fd->skip;
bufq_remove(&fdc->head, bp);
+
+ /* Tell devstat we have finished with the transaction */
+ devstat_end_transaction(&fd->device_stats,
+ bp->b_bcount - bp->b_resid,
+ DEVSTAT_TAG_NONE,
+ (bp->b_flags & B_READ) ? DEVSTAT_READ :
+ DEVSTAT_WRITE);
fdc->fd->skip = 0;
biodone(bp);
fdc->state = FINDWORK;
diff --git a/sys/pc98/pc98/wfd.c b/sys/pc98/pc98/wfd.c
index 560cfde..67d570a 100644
--- a/sys/pc98/pc98/wfd.c
+++ b/sys/pc98/pc98/wfd.c
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: wfd.c,v 1.14 1998/07/30 15:16:05 bde Exp $
+ * $Id: wfd.c,v 1.15 1998/08/23 20:16:34 phk Exp $
*/
/*
@@ -43,6 +43,7 @@
#include <sys/proc.h>
#include <sys/malloc.h>
#include <sys/buf.h>
+#include <sys/devicestat.h>
#include <sys/disklabel.h>
#include <sys/diskslice.h>
#include <sys/cdio.h>
@@ -141,6 +142,8 @@ struct wfd {
void *bdevs;
#endif
struct diskslices *dk_slices; /* virtual drives */
+
+ struct devstat device_stats;
};
static struct wfd *wfdtab[NUNIT]; /* Drive info by unit number */
@@ -263,6 +266,14 @@ wfdattach (struct atapi *ata, int unit, struct atapi_params *ap, int debug)
DV_CHR, UID_ROOT, GID_OPERATOR, 0640,
"rwfd%d", t->lun);
#endif /* DEVFS */
+
+ /*
+ * Export the drive to the devstat interface.
+ */
+ devstat_add_entry(&t->device_stats, "wfd",
+ wfdnlun, t->cap.sector_size,
+ DEVSTAT_NO_ORDERED_TAGS,
+ DEVSTAT_TYPE_FLOPPY | DEVSTAT_TYPE_IF_IDE);
return (1);
}
@@ -487,6 +498,9 @@ static void wfd_start (struct wfd *t)
/* Unqueue the request. */
bufq_remove(&t->buf_queue, bp);
+ /* Tell devstat we are starting on the transaction */
+ devstat_start_transaction(&t->device_stats);
+
/* We have a buf, now we should make a command
* First, translate the block to absolute and put it in terms of the
* logical blocksize of the device. */
@@ -574,6 +588,13 @@ static void wfd_done (struct wfd *t, struct buf *bp, int resid,
*/
if (((int)bp->b_driver1)-- <= 0) {
bp->b_resid = (int)bp->b_driver2;
+
+ /* Tell devstat we have finished with the transaction */
+ devstat_end_transaction(&t->device_stats,
+ bp->b_bcount - bp->b_resid,
+ DEVSTAT_TAG_NONE,
+ (bp->b_flags & B_READ) ? DEVSTAT_READ : DEVSTAT_WRITE);
+
biodone (bp);
}
OpenPOWER on IntegriCloud