Author: asomers
Date: Mon Nov 20 22:27:33 2017
New Revision: 326036
URL: https://svnweb.freebsd.org/changeset/base/326036

Log:
  da(4): Short-circuit unnecessary BIO_FLUSH commands
  
  sys/cam/scsi/scsi_da.c
        Complete BIO_FLUSH commands immediately if the da(4) device hasn't
        been written to since the last flush. If we haven't written to the
        device, there is no reason to send a flush.
  
  Submitted by: gibbs
  Reviewed by:  imp
  MFC after:    3 weeks
  Sponsored by: Spectra Logic Corp
  Differential Revision:        https://reviews.freebsd.org/D13106

Modified:
  head/sys/cam/scsi/scsi_da.c

Modified: head/sys/cam/scsi/scsi_da.c
==============================================================================
--- head/sys/cam/scsi/scsi_da.c Mon Nov 20 22:18:24 2017        (r326035)
+++ head/sys/cam/scsi/scsi_da.c Mon Nov 20 22:27:33 2017        (r326036)
@@ -3038,6 +3038,18 @@ more:
                }
                case BIO_FLUSH:
                        /*
+                        * If we don't support sync cache, or the disk
+                        * isn't dirty, FLUSH is a no-op.  Use the
+                        * allocated * CCB for the next bio if one is
+                        * available.
+                        */
+                       if ((softc->quirks & DA_Q_NO_SYNC_CACHE) != 0 ||
+                           (softc->flags & DA_FLAG_DIRTY) == 0) {
+                               biodone(bp);
+                               goto skipstate;
+                       }
+
+                       /*
                         * BIO_FLUSH doesn't currently communicate
                         * range data, so we synchronize the cache
                         * over the whole disk.  We also force
@@ -3052,6 +3064,15 @@ more:
                                               /*lb_count*/0,
                                               SSD_FULL_SIZE,
                                               da_default_timeout*1000);
+                       /*
+                        * Clear the dirty flag before sending the command.
+                        * Either this sync cache will be successful, or it
+                        * will fail after a retry.  If it fails, it is
+                        * unlikely to be successful if retried later, so
+                        * we'll save ourselves time by just marking the
+                        * device clean.
+                        */
+                       softc->flags &= ~DA_FLAG_DIRTY;
                        break;
                case BIO_ZONE: {
                        int error, queue_ccb;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to