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) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to