svn commit: r326779 - stable/11/sys/cam/scsi

Alan Somers asomers at FreeBSD.org
Mon Dec 11 20:30:59 UTC 2017


Author: asomers
Date: Mon Dec 11 20:30:58 2017
New Revision: 326779
URL: https://svnweb.freebsd.org/changeset/base/326779

Log:
  MFC r326036:
  
  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
  Sponsored by:	Spectra Logic Corp
  Differential Revision:	https://reviews.freebsd.org/D13106

Modified:
  stable/11/sys/cam/scsi/scsi_da.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/cam/scsi/scsi_da.c
==============================================================================
--- stable/11/sys/cam/scsi/scsi_da.c	Mon Dec 11 20:24:29 2017	(r326778)
+++ stable/11/sys/cam/scsi/scsi_da.c	Mon Dec 11 20:30:58 2017	(r326779)
@@ -2994,6 +2994,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
@@ -3008,6 +3020,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;


More information about the svn-src-all mailing list