aboutsummaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2018-02-22 11:18:33 +0000
committerWarner Losh <imp@FreeBSD.org>2018-02-22 11:18:33 +0000
commit0028abe633c12d1fe9d1e21e410a5bab8a289815 (patch)
tree48e299e65614856f7c401a89a928d9274d685117 /sys
parent91acaad987bc6f3240788f9ec10d506b01741e56 (diff)
downloadsrc-0028abe633c12d1fe9d1e21e410a5bab8a289815.tar.gz
src-0028abe633c12d1fe9d1e21e410a5bab8a289815.zip
Backout r329818, r329816 and r329815.
These aren't the commits I thought I was testing prior to commit. Revert until I can sort out what happened and fix it.
Notes
Notes: svn path=/head/; revision=329819
Diffstat (limited to 'sys')
-rw-r--r--sys/cam/ata/ata_da.c2
-rw-r--r--sys/cam/cam_iosched.c67
-rw-r--r--sys/cam/cam_iosched.h5
-rw-r--r--sys/cam/nvme/nvme_da.c71
-rw-r--r--sys/cam/scsi/scsi_da.c2
-rw-r--r--sys/dev/nvme/nvme.h3
6 files changed, 41 insertions, 109 deletions
diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c
index 2ff75277f58d..1a55ff41df80 100644
--- a/sys/cam/ata/ata_da.c
+++ b/sys/cam/ata/ata_da.c
@@ -1705,7 +1705,7 @@ adaregister(struct cam_periph *periph, void *arg)
announce_buf = softc->announce_temp;
bzero(announce_buf, ADA_ANNOUNCETMP_SZ);
- if (cam_iosched_init(&softc->cam_iosched, periph, 0) != 0) {
+ if (cam_iosched_init(&softc->cam_iosched, periph) != 0) {
printf("adaregister: Unable to probe new device. "
"Unable to allocate iosched memory\n");
free(softc, M_DEVBUF);
diff --git a/sys/cam/cam_iosched.c b/sys/cam/cam_iosched.c
index de91ccef466f..92d01fda50c6 100644
--- a/sys/cam/cam_iosched.c
+++ b/sys/cam/cam_iosched.c
@@ -68,8 +68,6 @@ static MALLOC_DEFINE(M_CAMSCHED, "CAM I/O Scheduler",
#define CAM_IOSCHED_FLAG_CALLOUT_ACTIVE (1ul << 1)
/* Timer has just ticked */
#define CAM_IOSCHED_FLAG_TICK (1ul << 2)
- /* When set, defer trims until after next tick */
-#define CAM_IOSCHED_FLAG_TRIM_QONLY (1ul << 4)
/* Periph drivers set these flags to indicate work */
#define CAM_IOSCHED_FLAG_WORK_FLAGS ((0xffffu) << 16)
@@ -292,7 +290,6 @@ struct cam_iosched_softc {
struct bio_queue_head trim_queue;
/* scheduler flags < 16, user flags >= 16 */
uint32_t flags;
- u_int caps;
int sort_io_queue;
#ifdef CAM_IOSCHED_DYNAMIC
int read_bias; /* Read bias setting */
@@ -590,7 +587,7 @@ cam_iosched_ticker(void *arg)
cam_iosched_limiter_tick(&isc->write_stats);
cam_iosched_limiter_tick(&isc->trim_stats);
- isc->flags |= CAM_IOSCHED_FLAG_TICK;
+ isc->flags |= CAM_IOSCHED_FLAGS_TICK;
cam_iosched_schedule(isc, isc->periph);
/*
@@ -1067,16 +1064,12 @@ cam_iosched_cl_sysctl_fini(struct control_loop *clp)
* sizeof struct cam_iosched_softc.
*/
int
-cam_iosched_init(struct cam_iosched_softc **iscp, struct cam_periph *periph,
- u_int caps)
+cam_iosched_init(struct cam_iosched_softc **iscp, struct cam_periph *periph)
{
*iscp = malloc(sizeof(**iscp), M_CAMSCHED, M_NOWAIT | M_ZERO);
if (*iscp == NULL)
return ENOMEM;
- (*iscp)->caps = caps;
- if (caps & CAM_IOSCHED_CAP_TRIM_CLOCKED)
- (*iscp)->flags |= CAM_IOSCHED_FLAG_TRIM_QONLY;
#ifdef CAM_IOSCHED_DYNAMIC
if (iosched_debug)
printf("CAM IOSCHEDULER Allocating entry at %p\n", *iscp);
@@ -1203,7 +1196,7 @@ cam_iosched_flush(struct cam_iosched_softc *isc, struct devstat *stp, int err)
#ifdef CAM_IOSCHED_DYNAMIC
static struct bio *
-cam_iosched_get_write(struct cam_iosched_softc *isc, bool wastick)
+cam_iosched_get_write(struct cam_iosched_softc *isc)
{
struct bio *bp;
@@ -1312,43 +1305,11 @@ cam_iosched_next_trim(struct cam_iosched_softc *isc)
*
* Assumes we're called with the periph lock held.
*/
-static struct bio *
-cam_iosched_get_trim(struct cam_iosched_softc *isc, bool wastick)
+struct bio *
+cam_iosched_get_trim(struct cam_iosched_softc *isc)
{
- /*
- * If there's no trims, return NULL. If we're clocking out the
- * trims rather than doing thins right away, this is where we
- * set the queue only bit. This causes us to ignore them until
- * the next clock tick. If we can't get a trim, and we're clocking
- * them out, if the queue is empty or if we're rate limited,
- * then set QONLY so we stop processing trims until the next
- * tick.
- */
- if (!cam_iosched_has_more_trim(isc)) {
- if ((isc->caps & CAM_IOSCHED_CAP_TRIM_CLOCKED) &&
- (bioq_first(&isc->trim_queue) == NULL ||
-#ifdef CAM_IOSCHED_DYNAMIC
- (isc->trim_stats.state_flags & IOP_RATE_LIMITED)
-#else
- false
-#endif
- ))
- isc->flags |= CAM_IOSCHED_FLAG_TRIM_QONLY;
- return NULL;
- }
-
- /*
- * If we just ticked, and we have trims, then turn off
- * the queue only flag.
- */
- if (wastick)
- isc->flags &= ~CAM_IOSCHED_FLAG_TRIM_QONLY;
-
- /*
- * If QONLY is set, no trims are eligble just now.
- */
- if (isc->flags & CAM_IOSCHED_FLAG_TRIM_QONLY)
+ if (!cam_iosched_has_more_trim(isc))
return NULL;
return cam_iosched_next_trim(isc);
@@ -1366,17 +1327,17 @@ cam_iosched_next_bio(struct cam_iosched_softc *isc)
struct bio *bp;
bool wastick;
- wastick = !!(isc->flags & CAM_IOSCHED_FLAG_TICK);
- isc->flags &= ~CAM_IOSCHED_FLAG_TICK;
+ wastick = !!(isc->flags & CAM_IOSCHED_FLAGS_TICK);
+ isc->flags &= ~CAM_IOSCHED_FLAGS_TICK;
/*
* See if we have a trim that can be scheduled. We can only send one
- * at a time down, so this takes that into account for those devices
- * that can only do one. In addition, some devices queue up a bunch
- * of TRIMs before sending them down as a batch.
+ * at a time down, so this takes that into account.
+ *
+ * XXX newer TRIM commands are queueable. Revisit this when we
+ * implement them.
*/
- if ((isc->flags & CAM_IOSCHED_FLAG_TRIM_QONLY) == 0 &&
- (bp = cam_iosched_get_trim(isc, wastick)) != NULL)
+ if ((bp = cam_iosched_get_trim(isc)) != NULL)
return bp;
#ifdef CAM_IOSCHED_DYNAMIC
@@ -1385,7 +1346,7 @@ cam_iosched_next_bio(struct cam_iosched_softc *isc)
* and if so, those are next.
*/
if (do_dynamic_iosched) {
- if ((bp = cam_iosched_get_write(isc, was_tick)) != NULL)
+ if ((bp = cam_iosched_get_write(isc)) != NULL)
return bp;
}
#endif
diff --git a/sys/cam/cam_iosched.h b/sys/cam/cam_iosched.h
index d7a055597284..aa1e87cef5c3 100644
--- a/sys/cam/cam_iosched.h
+++ b/sys/cam/cam_iosched.h
@@ -81,12 +81,11 @@ cam_iosched_sbintime_t(uintptr_t delta)
return (sbintime_t)((uint64_t)delta << CAM_IOSCHED_TIME_SHIFT);
}
-#define CAM_IOSCHED_CAP_TRIM_CLOCKED 0x1
-
-int cam_iosched_init(struct cam_iosched_softc **, struct cam_periph *periph, u_int caps);
+int cam_iosched_init(struct cam_iosched_softc **, struct cam_periph *periph);
void cam_iosched_fini(struct cam_iosched_softc *);
void cam_iosched_sysctl_init(struct cam_iosched_softc *, struct sysctl_ctx_list *, struct sysctl_oid *);
struct bio *cam_iosched_next_trim(struct cam_iosched_softc *isc);
+struct bio *cam_iosched_get_trim(struct cam_iosched_softc *isc);
struct bio *cam_iosched_next_bio(struct cam_iosched_softc *isc);
void cam_iosched_queue_work(struct cam_iosched_softc *isc, struct bio *bp);
void cam_iosched_flush(struct cam_iosched_softc *isc, struct devstat *stp, int err);
diff --git a/sys/cam/nvme/nvme_da.c b/sys/cam/nvme/nvme_da.c
index 7b7216e8dfdb..1afe840b733e 100644
--- a/sys/cam/nvme/nvme_da.c
+++ b/sys/cam/nvme/nvme_da.c
@@ -122,14 +122,6 @@ struct nda_softc {
#endif
};
-struct nda_trim_request {
- union {
- struct nvme_dsm_range dsm;
- uint8_t data[NVME_MAX_DSM_TRIM];
- } u;
- TAILQ_HEAD(, bio) bps;
-};
-
/* Need quirk table */
static disk_strategy_t ndastrategy;
@@ -158,14 +150,11 @@ static void ndasuspend(void *arg);
#ifndef NDA_DEFAULT_RETRY
#define NDA_DEFAULT_RETRY 4
#endif
-#ifndef NDA_MAX_TRIM_ENTRIES
-#define NDA_MAX_TRIM_ENTRIES 256 /* Number of DSM trims to use, max 256 */
-#endif
+
//static int nda_retry_count = NDA_DEFAULT_RETRY;
static int nda_send_ordered = NDA_DEFAULT_SEND_ORDERED;
static int nda_default_timeout = NDA_DEFAULT_TIMEOUT;
-static int nda_max_trim_entries = NDA_MAX_TRIM_ENTRIES;
/*
* All NVMe media is non-rotational, so all nvme device instances
@@ -702,8 +691,7 @@ ndaregister(struct cam_periph *periph, void *arg)
return(CAM_REQ_CMP_ERR);
}
- if (cam_iosched_init(&softc->cam_iosched, periph,
- CAM_IOSCHED_CAP_TRIM_CLOCKED) != 0) {
+ if (cam_iosched_init(&softc->cam_iosched, periph) != 0) {
printf("ndaregister: Unable to probe new device. "
"Unable to allocate iosched memory\n");
return(CAM_REQ_CMP_ERR);
@@ -906,40 +894,22 @@ ndastart(struct cam_periph *periph, union ccb *start_ccb)
}
case BIO_DELETE:
{
- struct nvme_dsm_range *dsm_range, *dsm_end;
- struct nda_trim_request *trim;
- struct bio *bp1;
- int ents;
+ struct nvme_dsm_range *dsm_range;
- trim = malloc(sizeof(*trim), M_NVMEDA, M_ZERO | M_NOWAIT);
- if (trim == NULL) {
+ dsm_range =
+ malloc(sizeof(*dsm_range), M_NVMEDA, M_ZERO | M_NOWAIT);
+ if (dsm_range == NULL) {
biofinish(bp, NULL, ENOMEM);
xpt_release_ccb(start_ccb);
ndaschedule(periph);
return;
}
- TAILQ_INIT(&trim->bps);
- bp1 = bp;
- ents = sizeof(trim->u.data) / sizeof(struct nvme_dsm_range);
- ents = min(ents, nda_max_trim_entries);
- dsm_range = &trim->u.dsm;
- dsm_end = dsm_range + ents;
- do {
- TAILQ_INSERT_TAIL(&trim->bps, bp1, bio_queue);
- dsm_range->length =
- bp1->bio_bcount / softc->disk->d_sectorsize;
- dsm_range->starting_lba =
- bp1->bio_offset / softc->disk->d_sectorsize;
- dsm_range++;
- if (dsm_range >= dsm_end)
- break;
- bp1 = cam_iosched_next_trim(softc->cam_iosched);
- /* XXX -- Could collapse adjacent ranges, but we don't for now */
- /* XXX -- Could limit based on total payload size */
- } while (bp1 != NULL);
- bp->bio_driver2 = trim;
- nda_nvme_trim(softc, &start_ccb->nvmeio, &trim->u.dsm,
- dsm_range - &trim->u.dsm);
+ dsm_range->length =
+ bp->bio_bcount / softc->disk->d_sectorsize;
+ dsm_range->starting_lba =
+ bp->bio_offset / softc->disk->d_sectorsize;
+ bp->bio_driver2 = dsm_range;
+ 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;
/*
@@ -1020,6 +990,8 @@ ndadone(struct cam_periph *periph, union ccb *done_ccb)
} else {
bp->bio_resid = 0;
}
+ if (state == NDA_CCB_TRIM)
+ free(bp->bio_driver2, M_NVMEDA);
softc->outstanding_cmds--;
/*
@@ -1031,15 +1003,13 @@ ndadone(struct cam_periph *periph, union ccb *done_ccb)
cam_iosched_bio_complete(softc->cam_iosched, bp, done_ccb);
xpt_release_ccb(done_ccb);
if (state == NDA_CCB_TRIM) {
- struct nda_trim_request *trim;
- struct bio *bp1;
+#ifdef notyet
TAILQ_HEAD(, bio) queue;
+ struct bio *bp1;
- trim = bp->bio_driver2;
TAILQ_INIT(&queue);
- TAILQ_CONCAT(&queue, &trim->bps, bio_queue);
- free(trim, M_NVMEDA);
-
+ TAILQ_CONCAT(&queue, &softc->trim_req.bps, bio_queue);
+#endif
/*
* Since we can have multiple trims in flight, we don't
* need to call this here.
@@ -1047,6 +1017,8 @@ ndadone(struct cam_periph *periph, union ccb *done_ccb)
*/
ndaschedule(periph);
cam_periph_unlock(periph);
+#ifdef notyet
+/* Not yet collapsing several BIO_DELETE requests into one TRIM */
while ((bp1 = TAILQ_FIRST(&queue)) != NULL) {
TAILQ_REMOVE(&queue, bp1, bio_queue);
bp1->bio_error = error;
@@ -1057,6 +1029,9 @@ ndadone(struct cam_periph *periph, union ccb *done_ccb)
bp1->bio_resid = 0;
biodone(bp1);
}
+#else
+ biodone(bp);
+#endif
} else {
ndaschedule(periph);
cam_periph_unlock(periph);
diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c
index e346207238f3..5f061db91cbe 100644
--- a/sys/cam/scsi/scsi_da.c
+++ b/sys/cam/scsi/scsi_da.c
@@ -2572,7 +2572,7 @@ daregister(struct cam_periph *periph, void *arg)
return(CAM_REQ_CMP_ERR);
}
- if (cam_iosched_init(&softc->cam_iosched, periph, 0) != 0) {
+ if (cam_iosched_init(&softc->cam_iosched, periph) != 0) {
printf("daregister: Unable to probe new device. "
"Unable to allocate iosched memory\n");
free(softc, M_DEVBUF);
diff --git a/sys/dev/nvme/nvme.h b/sys/dev/nvme/nvme.h
index 744688875157..5d11f79337fe 100644
--- a/sys/dev/nvme/nvme.h
+++ b/sys/dev/nvme/nvme.h
@@ -59,9 +59,6 @@
/* Cap nvme to 1MB transfers driver explodes with larger sizes */
#define NVME_MAX_XFER_SIZE (MAXPHYS < (1<<20) ? MAXPHYS : (1<<20))
-/* Largest DSM Trim that can be done */
-#define NVME_MAX_DSM_TRIM 4096
-
union cap_lo_register {
uint32_t raw;
struct {