svn commit: r265671 - in stable/9/sys: geom kern sys

Alexander Motin mav at FreeBSD.org
Thu May 8 12:26:09 UTC 2014


Author: mav
Date: Thu May  8 12:26:08 2014
New Revision: 265671
URL: http://svnweb.freebsd.org/changeset/base/265671

Log:
  MFC r256603:
  Introduce new function devstat_end_transaction_bio_bt(), adding new argument
  to specify present time.  Use this function to move binuptime() out of lock,
  substantially reducing lock congestion when slow timecounter is used.

Modified:
  stable/9/sys/geom/geom_disk.c
  stable/9/sys/geom/geom_io.c
  stable/9/sys/kern/subr_devstat.c
  stable/9/sys/sys/devicestat.h
Directory Properties:
  stable/9/   (props changed)
  stable/9/sys/   (props changed)
  stable/9/sys/sys/   (props changed)

Modified: stable/9/sys/geom/geom_disk.c
==============================================================================
--- stable/9/sys/geom/geom_disk.c	Thu May  8 12:23:30 2014	(r265670)
+++ stable/9/sys/geom/geom_disk.c	Thu May  8 12:26:08 2014	(r265671)
@@ -233,6 +233,7 @@ g_disk_setstate(struct bio *bp, struct g
 static void
 g_disk_done(struct bio *bp)
 {
+	struct bintime now;
 	struct bio *bp2;
 	struct g_disk_softc *sc;
 
@@ -241,12 +242,13 @@ g_disk_done(struct bio *bp)
 	bp2 = bp->bio_parent;
 	sc = bp2->bio_to->private;
 	bp->bio_completed = bp->bio_length - bp->bio_resid;
+	binuptime(&now);
 	mtx_lock(&sc->done_mtx);
 	if (bp2->bio_error == 0)
 		bp2->bio_error = bp->bio_error;
 	bp2->bio_completed += bp->bio_completed;
 	if ((bp->bio_cmd & (BIO_READ|BIO_WRITE|BIO_DELETE)) != 0)
-		devstat_end_transaction_bio(sc->dp->d_devstat, bp);
+		devstat_end_transaction_bio_bt(sc->dp->d_devstat, bp, &now);
 	g_destroy_bio(bp);
 	bp2->bio_inbed++;
 	if (bp2->bio_children == bp2->bio_inbed) {

Modified: stable/9/sys/geom/geom_io.c
==============================================================================
--- stable/9/sys/geom/geom_io.c	Thu May  8 12:23:30 2014	(r265670)
+++ stable/9/sys/geom/geom_io.c	Thu May  8 12:26:08 2014	(r265671)
@@ -510,6 +510,7 @@ g_io_request(struct bio *bp, struct g_co
 void
 g_io_deliver(struct bio *bp, int error)
 {
+	struct bintime now;
 	struct g_consumer *cp;
 	struct g_provider *pp;
 	int first;
@@ -563,11 +564,13 @@ g_io_deliver(struct bio *bp, int error)
 	 * can not update one instance of the statistics from more
 	 * than one thread at a time, so grab the lock first.
 	 */
+	if (g_collectstats)
+		binuptime(&now);
 	g_bioq_lock(&g_bio_run_up);
 	if (g_collectstats & 1)
-		devstat_end_transaction_bio(pp->stat, bp);
+		devstat_end_transaction_bio_bt(pp->stat, bp, &now);
 	if (g_collectstats & 2)
-		devstat_end_transaction_bio(cp->stat, bp);
+		devstat_end_transaction_bio_bt(cp->stat, bp, &now);
 
 	cp->nend++;
 	pp->nend++;

Modified: stable/9/sys/kern/subr_devstat.c
==============================================================================
--- stable/9/sys/kern/subr_devstat.c	Thu May  8 12:23:30 2014	(r265670)
+++ stable/9/sys/kern/subr_devstat.c	Thu May  8 12:26:08 2014	(r265671)
@@ -339,6 +339,14 @@ devstat_end_transaction(struct devstat *
 void
 devstat_end_transaction_bio(struct devstat *ds, struct bio *bp)
 {
+
+	devstat_end_transaction_bio_bt(ds, bp, NULL);
+}
+
+void
+devstat_end_transaction_bio_bt(struct devstat *ds, struct bio *bp,
+    struct bintime *now)
+{
 	devstat_trans_flags flg;
 
 	/* sanity check */
@@ -355,7 +363,7 @@ devstat_end_transaction_bio(struct devst
 		flg = DEVSTAT_NO_DATA;
 
 	devstat_end_transaction(ds, bp->bio_bcount - bp->bio_resid,
-				DEVSTAT_TAG_SIMPLE, flg, NULL, &bp->bio_t0);
+				DEVSTAT_TAG_SIMPLE, flg, now, &bp->bio_t0);
 	DTRACE_DEVSTAT_BIO_DONE();
 }
 

Modified: stable/9/sys/sys/devicestat.h
==============================================================================
--- stable/9/sys/sys/devicestat.h	Thu May  8 12:23:30 2014	(r265670)
+++ stable/9/sys/sys/devicestat.h	Thu May  8 12:26:08 2014	(r265671)
@@ -199,6 +199,8 @@ void devstat_end_transaction(struct devs
 			     devstat_trans_flags flags,
 			     struct bintime *now, struct bintime *then);
 void devstat_end_transaction_bio(struct devstat *ds, struct bio *bp);
+void devstat_end_transaction_bio_bt(struct devstat *ds, struct bio *bp,
+			     struct bintime *now);
 #endif
 
 #endif /* _DEVICESTAT_H */


More information about the svn-src-stable-9 mailing list