svn commit: r356588 - stable/12/sys/geom

Alexander Motin mav at FreeBSD.org
Fri Jan 10 00:53:21 UTC 2020


Author: mav
Date: Fri Jan 10 00:53:20 2020
New Revision: 356588
URL: https://svnweb.freebsd.org/changeset/base/356588

Log:
  MFC r356214: Avoid few memory accesses in g_disk_done().

Modified:
  stable/12/sys/geom/geom_disk.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/geom/geom_disk.c
==============================================================================
--- stable/12/sys/geom/geom_disk.c	Fri Jan 10 00:48:00 2020	(r356587)
+++ stable/12/sys/geom/geom_disk.c	Fri Jan 10 00:53:20 2020	(r356588)
@@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$");
 struct g_disk_softc {
 	struct mtx		 done_mtx;
 	struct disk		*dp;
+	struct devstat		*d_devstat;
 	struct sysctl_ctx_list	sysctl_ctx;
 	struct sysctl_oid	*sysctl_tree;
 	char			led[64];
@@ -232,15 +233,13 @@ g_disk_done(struct bio *bp)
 	struct g_disk_softc *sc;
 
 	/* See "notes" for why we need a mutex here */
-	/* XXX: will witness accept a mix of Giant/unGiant drivers here ? */
+	sc = bp->bio_caller1;
 	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;
+	bp2->bio_completed += bp->bio_length - bp->bio_resid;
 
 	switch (bp->bio_cmd) {
 	case BIO_ZONE:
@@ -250,7 +249,7 @@ g_disk_done(struct bio *bp)
 	case BIO_WRITE:
 	case BIO_DELETE:
 	case BIO_FLUSH:
-		devstat_end_transaction_bio_bt(sc->dp->d_devstat, bp, &now);
+		devstat_end_transaction_bio_bt(sc->d_devstat, bp, &now);
 		break;
 	default:
 		break;
@@ -470,6 +469,7 @@ g_disk_start(struct bio *bp)
 					bp->bio_error = ENOMEM;
 			}
 			bp2->bio_done = g_disk_done;
+			bp2->bio_caller1 = sc;
 			bp2->bio_pblkno = bp2->bio_offset / dp->d_sectorsize;
 			bp2->bio_bcount = bp2->bio_length;
 			bp2->bio_disk = dp;
@@ -555,6 +555,7 @@ g_disk_start(struct bio *bp)
 			return;
 		}
 		bp2->bio_done = g_disk_done;
+		bp2->bio_caller1 = sc;
 		bp2->bio_disk = dp;
 		mtx_lock(&sc->start_mtx);
 		devstat_start_transaction_bio(dp->d_devstat, bp2);
@@ -709,6 +710,7 @@ g_disk_create(void *arg, int flag)
 	mtx_init(&sc->start_mtx, "g_disk_start", NULL, MTX_DEF);
 	mtx_init(&sc->done_mtx, "g_disk_done", NULL, MTX_DEF);
 	sc->dp = dp;
+	sc->d_devstat = dp->d_devstat;
 	gp = g_new_geomf(&g_disk_class, "%s%d", dp->d_name, dp->d_unit);
 	gp->softc = sc;
 	LIST_FOREACH(dap, &dp->d_aliases, da_next) {


More information about the svn-src-all mailing list