Author: imp
Date: Fri Sep 15 20:16:06 2017
New Revision: 323625
URL: https://svnweb.freebsd.org/changeset/base/323625

Log:
  Allow multiple TRIMs to be done for nda
  
  Don't call cam_iosched_trim_done or cam_iosched_submit_trim for nda
  since its hardware can handle almost an arbitrary number of TRIMs and
  we don't have to be careful to only ever do one.
  
  Sponsored by: Netflix

Modified:
  head/sys/cam/nvme/nvme_da.c

Modified: head/sys/cam/nvme/nvme_da.c
==============================================================================
--- head/sys/cam/nvme/nvme_da.c Fri Sep 15 20:15:55 2017        (r323624)
+++ head/sys/cam/nvme/nvme_da.c Fri Sep 15 20:16:06 2017        (r323625)
@@ -920,7 +920,12 @@ ndastart(struct cam_periph *periph, union ccb *start_c
                        nda_nvme_trim(softc, &start_ccb->nvmeio, dsm_range, 1);
                        start_ccb->ccb_h.ccb_state = NDA_CCB_TRIM;
                        start_ccb->ccb_h.flags |= CAM_UNLOCKED;
-                       cam_iosched_submit_trim(softc->cam_iosched);    /* XXX 
*/
+                       /*
+                        * Note: We can have multiple TRIMs in flight, so we 
don't call
+                        * cam_iosched_submit_trim(softc->cam_iosched);
+                        * since that forces the I/O scheduler to only schedule 
one at a time.
+                        * On NVMe drives, this is a performance disaster.
+                        */
                        goto out;
                }
                case BIO_FLUSH:
@@ -1013,7 +1018,11 @@ ndadone(struct cam_periph *periph, union ccb *done_ccb
                        TAILQ_INIT(&queue);
                        TAILQ_CONCAT(&queue, &softc->trim_req.bps, bio_queue);
 #endif
-                       cam_iosched_trim_done(softc->cam_iosched);
+                       /*
+                        * Since we can have multiple trims in flight, we don't
+                        * need to call this here.
+                        * cam_iosched_trim_done(softc->cam_iosched);
+                        */
                        ndaschedule(periph);
                        cam_periph_unlock(periph);
 #ifdef notyet
_______________________________________________
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