From owner-svn-src-head@freebsd.org Thu Feb 22 11:18:35 2018 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 38226F23882; Thu, 22 Feb 2018 11:18:35 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id E15C17C325; Thu, 22 Feb 2018 11:18:34 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id D5F8826DE4; Thu, 22 Feb 2018 11:18:34 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w1MBIYx8034685; Thu, 22 Feb 2018 11:18:34 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w1MBIYQa034679; Thu, 22 Feb 2018 11:18:34 GMT (envelope-from imp@FreeBSD.org) Message-Id: <201802221118.w1MBIYQa034679@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Thu, 22 Feb 2018 11:18:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r329819 - in head/sys: cam cam/ata cam/nvme cam/scsi dev/nvme X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: in head/sys: cam cam/ata cam/nvme cam/scsi dev/nvme X-SVN-Commit-Revision: 329819 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Feb 2018 11:18:35 -0000 Author: imp Date: Thu Feb 22 11:18:33 2018 New Revision: 329819 URL: https://svnweb.freebsd.org/changeset/base/329819 Log: 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. Modified: head/sys/cam/ata/ata_da.c head/sys/cam/cam_iosched.c head/sys/cam/cam_iosched.h head/sys/cam/nvme/nvme_da.c head/sys/cam/scsi/scsi_da.c head/sys/dev/nvme/nvme.h Modified: head/sys/cam/ata/ata_da.c ============================================================================== --- head/sys/cam/ata/ata_da.c Thu Feb 22 10:55:23 2018 (r329818) +++ head/sys/cam/ata/ata_da.c Thu Feb 22 11:18:33 2018 (r329819) @@ -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); Modified: head/sys/cam/cam_iosched.c ============================================================================== --- head/sys/cam/cam_iosched.c Thu Feb 22 10:55:23 2018 (r329818) +++ head/sys/cam/cam_iosched.c Thu Feb 22 11:18:33 2018 (r329819) @@ -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, struc #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,45 +1305,13 @@ 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; + if (!cam_iosched_has_more_trim(isc)) 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) - 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 Modified: head/sys/cam/cam_iosched.h ============================================================================== --- head/sys/cam/cam_iosched.h Thu Feb 22 10:55:23 2018 (r329818) +++ head/sys/cam/cam_iosched.h Thu Feb 22 11:18:33 2018 (r329819) @@ -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); Modified: head/sys/cam/nvme/nvme_da.c ============================================================================== --- head/sys/cam/nvme/nvme_da.c Thu Feb 22 10:55:23 2018 (r329818) +++ head/sys/cam/nvme/nvme_da.c Thu Feb 22 11:18:33 2018 (r329819) @@ -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_c } 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); Modified: head/sys/cam/scsi/scsi_da.c ============================================================================== --- head/sys/cam/scsi/scsi_da.c Thu Feb 22 10:55:23 2018 (r329818) +++ head/sys/cam/scsi/scsi_da.c Thu Feb 22 11:18:33 2018 (r329819) @@ -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); Modified: head/sys/dev/nvme/nvme.h ============================================================================== --- head/sys/dev/nvme/nvme.h Thu Feb 22 10:55:23 2018 (r329818) +++ head/sys/dev/nvme/nvme.h Thu Feb 22 11:18:33 2018 (r329819) @@ -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 {