diff options
author | Warner Losh <imp@FreeBSD.org> | 2018-02-22 11:18:33 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2018-02-22 11:18:33 +0000 |
commit | 0028abe633c12d1fe9d1e21e410a5bab8a289815 (patch) | |
tree | 48e299e65614856f7c401a89a928d9274d685117 /sys | |
parent | 91acaad987bc6f3240788f9ec10d506b01741e56 (diff) | |
download | src-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.c | 2 | ||||
-rw-r--r-- | sys/cam/cam_iosched.c | 67 | ||||
-rw-r--r-- | sys/cam/cam_iosched.h | 5 | ||||
-rw-r--r-- | sys/cam/nvme/nvme_da.c | 71 | ||||
-rw-r--r-- | sys/cam/scsi/scsi_da.c | 2 | ||||
-rw-r--r-- | sys/dev/nvme/nvme.h | 3 |
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 { |