Author: mav
Date: Fri Jan 10 00:55:37 2020
New Revision: 356589
URL: https://svnweb.freebsd.org/changeset/base/356589

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

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

Modified: stable/11/sys/geom/geom_disk.c
==============================================================================
--- stable/11/sys/geom/geom_disk.c      Fri Jan 10 00:53:20 2020        
(r356588)
+++ stable/11/sys/geom/geom_disk.c      Fri Jan 10 00:55:37 2020        
(r356589)
@@ -64,6 +64,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];
@@ -228,15 +229,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:
@@ -246,7 +245,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;
@@ -463,6 +462,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;
@@ -548,6 +548,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);
@@ -702,6 +703,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;
        pp = g_new_providerf(gp, "%s", gp->name);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to