diff options
author | Warner Losh <imp@FreeBSD.org> | 2017-09-15 20:16:06 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2017-09-15 20:16:06 +0000 |
commit | 851063e16a43248efd4b5d02f90d947bf34295ba (patch) | |
tree | 417af45118fec51ccac888b840add6bee5835f25 /sys/cam/nvme/nvme_da.c | |
parent | 55c770b40ab137e89cfd4bea6c71e4f3199c4c0e (diff) | |
download | src-851063e16a43248efd4b5d02f90d947bf34295ba.tar.gz src-851063e16a43248efd4b5d02f90d947bf34295ba.zip |
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
Notes
Notes:
svn path=/head/; revision=323625
Diffstat (limited to 'sys/cam/nvme/nvme_da.c')
-rw-r--r-- | sys/cam/nvme/nvme_da.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/cam/nvme/nvme_da.c b/sys/cam/nvme/nvme_da.c index 3e829a4e8e9b..8e4de784c3a1 100644 --- a/sys/cam/nvme/nvme_da.c +++ b/sys/cam/nvme/nvme_da.c @@ -920,7 +920,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: @@ -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 |