MFC r289110:

Make geom_nop(4) collect statistics on all types of BIOs, not just
reads and writes.

PR:		kern/198405
Submitted by:	Matthew D. Fuller <fullermd at over-yonder dot net>
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D3679
This commit is contained in:
trasz 2016-01-12 09:27:01 +00:00
parent ea425694b7
commit 2d6e438962
3 changed files with 47 additions and 4 deletions

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd September 15, 2015
.Dd October 10, 2015
.Dt GNOP 8
.Os
.Sh NAME
@ -72,9 +72,10 @@ The
utility is used for setting up transparent providers on existing ones.
Its main purpose is testing other GEOM classes, as it allows forced provider
removal and I/O error simulation with a given probability.
It also gathers the following statistics: number of read requests, number of
write requests, number of bytes read and number of bytes written.
In addition, it can be used as a good starting point for implementing new GEOM
It also gathers statistics on the number of read, write, delete,
getattr, flush, and other requests, and the number of bytes read and written.
.Nm
can also be used as a good starting point for implementing new GEOM
classes.
.Pp
The first argument to

View File

@ -119,6 +119,24 @@ g_nop_start(struct bio *bp)
sc->sc_wrotebytes += bp->bio_length;
failprob = sc->sc_wfailprob;
break;
case BIO_DELETE:
sc->sc_deletes++;
break;
case BIO_GETATTR:
sc->sc_getattrs++;
break;
case BIO_FLUSH:
sc->sc_flushes++;
break;
case BIO_CMD0:
sc->sc_cmd0s++;
break;
case BIO_CMD1:
sc->sc_cmd1s++;
break;
case BIO_CMD2:
sc->sc_cmd2s++;
break;
}
mtx_unlock(&sc->sc_lock);
if (failprob > 0) {
@ -238,6 +256,12 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp,
sc->sc_wfailprob = wfailprob;
sc->sc_reads = 0;
sc->sc_writes = 0;
sc->sc_deletes = 0;
sc->sc_getattrs = 0;
sc->sc_flushes = 0;
sc->sc_cmd0s = 0;
sc->sc_cmd1s = 0;
sc->sc_cmd2s = 0;
sc->sc_readbytes = 0;
sc->sc_wrotebytes = 0;
mtx_init(&sc->sc_lock, "gnop lock", NULL, MTX_DEF);
@ -602,6 +626,12 @@ g_nop_ctl_reset(struct gctl_req *req, struct g_class *mp)
sc = pp->geom->softc;
sc->sc_reads = 0;
sc->sc_writes = 0;
sc->sc_deletes = 0;
sc->sc_getattrs = 0;
sc->sc_flushes = 0;
sc->sc_cmd0s = 0;
sc->sc_cmd1s = 0;
sc->sc_cmd2s = 0;
sc->sc_readbytes = 0;
sc->sc_wrotebytes = 0;
}
@ -659,6 +689,12 @@ g_nop_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp,
sbuf_printf(sb, "%s<Error>%d</Error>\n", indent, sc->sc_error);
sbuf_printf(sb, "%s<Reads>%ju</Reads>\n", indent, sc->sc_reads);
sbuf_printf(sb, "%s<Writes>%ju</Writes>\n", indent, sc->sc_writes);
sbuf_printf(sb, "%s<Deletes>%ju</Deletes>\n", indent, sc->sc_deletes);
sbuf_printf(sb, "%s<Getattrs>%ju</Getattrs>\n", indent, sc->sc_getattrs);
sbuf_printf(sb, "%s<Flushes>%ju</Flushes>\n", indent, sc->sc_flushes);
sbuf_printf(sb, "%s<Cmd0s>%ju</Cmd0s>\n", indent, sc->sc_cmd0s);
sbuf_printf(sb, "%s<Cmd1s>%ju</Cmd1s>\n", indent, sc->sc_cmd1s);
sbuf_printf(sb, "%s<Cmd2s>%ju</Cmd2s>\n", indent, sc->sc_cmd2s);
sbuf_printf(sb, "%s<ReadBytes>%ju</ReadBytes>\n", indent,
sc->sc_readbytes);
sbuf_printf(sb, "%s<WroteBytes>%ju</WroteBytes>\n", indent,

View File

@ -65,6 +65,12 @@ struct g_nop_softc {
u_int sc_wfailprob;
uintmax_t sc_reads;
uintmax_t sc_writes;
uintmax_t sc_deletes;
uintmax_t sc_getattrs;
uintmax_t sc_flushes;
uintmax_t sc_cmd0s;
uintmax_t sc_cmd1s;
uintmax_t sc_cmd2s;
uintmax_t sc_readbytes;
uintmax_t sc_wrotebytes;
struct mtx sc_lock;