summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2018-02-01 21:12:09 +0000
committermav <mav@FreeBSD.org>2018-02-01 21:12:09 +0000
commite38b1b844d045fb5dcf4db6f2795f7797022ca17 (patch)
treebb0e81a7e8f7be3ea107384c4472cdf5350d413d
parent564c222db819a26521c7a49aab8cf41b58957045 (diff)
downloadFreeBSD-src-e38b1b844d045fb5dcf4db6f2795f7797022ca17.zip
FreeBSD-src-e38b1b844d045fb5dcf4db6f2795f7797022ca17.tar.gz
MFC r323625 (by imp): 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.
-rw-r--r--sys/cam/nvme/nvme_da.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/cam/nvme/nvme_da.c b/sys/cam/nvme/nvme_da.c
index ae42935..8b95c16 100644
--- a/sys/cam/nvme/nvme_da.c
+++ b/sys/cam/nvme/nvme_da.c
@@ -918,7 +918,12 @@ ndastart(struct cam_periph *periph, union ccb *start_ccb)
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:
@@ -1005,7 +1010,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
OpenPOWER on IntegriCloud