summaryrefslogtreecommitdiffstats
path: root/sys/geom/geom_subr.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2003-02-07 23:08:24 +0000
committerphk <phk@FreeBSD.org>2003-02-07 23:08:24 +0000
commite8f2dea5ddc06968c8deacd684154cd56b9664ff (patch)
tree926f1fc791d8d4e6893f5573cb0b3fed3a603f7c /sys/geom/geom_subr.c
parent3c791c8729585027435477ccde6a53be4ba01225 (diff)
downloadFreeBSD-src-e8f2dea5ddc06968c8deacd684154cd56b9664ff.zip
FreeBSD-src-e8f2dea5ddc06968c8deacd684154cd56b9664ff.tar.gz
Commit the correct copy of the g_stat structure.
Add debug.sizeof.g_stat sysctl. Set the id field of the g_stat when we create consumers and providers. Remove biocount from consumer, we will use the counters in the g_stat structure instead. Replace one field which will need to be atomically manipulated with two fields which will not (stat.nop and stat.nend). Change add companion field to bio_children: bio_inbed for the exact same reason. Don't output the biocount in the confdot output. Fix KASSERT in g_io_request(). Add sysctl kern.geom.collectstats defaulting to off. Collect the following raw statistics conditioned on this sysctl: for each consumer and provider { total number of operations started. total number of operations completed. time last operation completed. sum of idle-time. for each of BIO_READ, BIO_WRITE and BIO_DELETE { number of operations completed. number of bytes completed. number of ENOMEM errors. number of other errors. sum of transaction time. } } API for getting hold of these statistics data not included yet.
Diffstat (limited to 'sys/geom/geom_subr.c')
-rw-r--r--sys/geom/geom_subr.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c
index 0d28978..d8b3054 100644
--- a/sys/geom/geom_subr.c
+++ b/sys/geom/geom_subr.c
@@ -145,6 +145,7 @@ g_new_consumer(struct g_geom *gp)
cp = g_malloc(sizeof *cp, M_ZERO);
cp->protect = 0x020016602;
cp->geom = gp;
+ cp->stat.id = cp;
LIST_INSERT_HEAD(&gp->consumer, cp, consumer);
return(cp);
}
@@ -184,6 +185,7 @@ g_new_providerf(struct g_geom *gp, const char *fmt, ...)
LIST_INIT(&pp->consumers);
pp->error = ENXIO;
pp->geom = gp;
+ pp->stat.id = pp;
LIST_INSERT_HEAD(&gp->provider, pp, provider);
g_nproviders++;
g_post_event(EV_NEW_PROVIDER, NULL, NULL, pp, NULL);
@@ -327,7 +329,7 @@ g_detach(struct g_consumer *cp)
KASSERT(cp->acr == 0, ("detach but nonzero acr"));
KASSERT(cp->acw == 0, ("detach but nonzero acw"));
KASSERT(cp->ace == 0, ("detach but nonzero ace"));
- KASSERT(cp->biocount == 0, ("detach but nonzero biocount"));
+ KASSERT(cp->stat.nop == cp->stat.nend, ("detach with active requests"));
pp = cp->provider;
LIST_REMOVE(cp, consumers);
cp->provider = NULL;
@@ -499,8 +501,8 @@ g_std_done(struct bio *bp)
bp2->bio_error = bp->bio_error;
bp2->bio_completed += bp->bio_completed;
g_destroy_bio(bp);
- bp2->bio_children--; /* XXX: atomic ? */
- if (bp2->bio_children == 0)
+ bp2->bio_inbed++;
+ if (bp2->bio_children == bp2->bio_inbed)
g_io_deliver(bp2, bp2->bio_error);
}
OpenPOWER on IntegriCloud