* remove most req->special users
@ 2018-11-09 18:32 Christoph Hellwig
2018-11-09 18:32 ` [PATCH 1/6] fnic: fix fnic_scsi_host_{start,end}_tag Christoph Hellwig
` (6 more replies)
0 siblings, 7 replies; 16+ messages in thread
From: Christoph Hellwig @ 2018-11-09 18:32 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block
Try to get rid of the req->special users so that we can remove this
field. With this series we basically only have the osd / scsi BIDI
code left, which should go away in another series.
Note that the first one is a bug fix for the blk-mq conversion
series, I don't think the current fnic code can work, but this
version is only compile tested as well.
^ permalink raw reply [flat|nested] 16+ messages in thread* [PATCH 1/6] fnic: fix fnic_scsi_host_{start,end}_tag 2018-11-09 18:32 remove most req->special users Christoph Hellwig @ 2018-11-09 18:32 ` Christoph Hellwig 2018-11-10 12:56 ` Hannes Reinecke 2018-11-09 18:32 ` [PATCH 2/6] nullb: remove leftover legacy request code Christoph Hellwig ` (5 subsequent siblings) 6 siblings, 1 reply; 16+ messages in thread From: Christoph Hellwig @ 2018-11-09 18:32 UTC (permalink / raw) To: Jens Axboe; +Cc: linux-block They way these functions abuse ->special to try to store the dummy request looks completely broken, given that it actually stores the original scsi command. Instead switch to ->host_scribble and store the actual dummy command. Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/scsi/fnic/fnic_scsi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c index 96acfcecd540..cafbcfb85bfa 100644 --- a/drivers/scsi/fnic/fnic_scsi.c +++ b/drivers/scsi/fnic/fnic_scsi.c @@ -2274,7 +2274,7 @@ fnic_scsi_host_start_tag(struct fnic *fnic, struct scsi_cmnd *sc) return SCSI_NO_TAG; sc->tag = sc->request->tag = dummy->tag; - sc->request->special = sc; + sc->host_scribble = (unsigned char *)dummy; return dummy->tag; } @@ -2286,7 +2286,7 @@ fnic_scsi_host_start_tag(struct fnic *fnic, struct scsi_cmnd *sc) static inline void fnic_scsi_host_end_tag(struct fnic *fnic, struct scsi_cmnd *sc) { - struct request *dummy = sc->request->special; + struct request *dummy = (struct request *)sc->host_scribble; blk_mq_free_request(dummy); } -- 2.19.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 1/6] fnic: fix fnic_scsi_host_{start,end}_tag 2018-11-09 18:32 ` [PATCH 1/6] fnic: fix fnic_scsi_host_{start,end}_tag Christoph Hellwig @ 2018-11-10 12:56 ` Hannes Reinecke 0 siblings, 0 replies; 16+ messages in thread From: Hannes Reinecke @ 2018-11-10 12:56 UTC (permalink / raw) To: Christoph Hellwig, Jens Axboe; +Cc: linux-block On 11/9/18 7:32 PM, Christoph Hellwig wrote: > They way these functions abuse ->special to try to store the dummy > request looks completely broken, given that it actually stores the > original scsi command. > > Instead switch to ->host_scribble and store the actual dummy command. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > drivers/scsi/fnic/fnic_scsi.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c > index 96acfcecd540..cafbcfb85bfa 100644 > --- a/drivers/scsi/fnic/fnic_scsi.c > +++ b/drivers/scsi/fnic/fnic_scsi.c > @@ -2274,7 +2274,7 @@ fnic_scsi_host_start_tag(struct fnic *fnic, struct scsi_cmnd *sc) > return SCSI_NO_TAG; > > sc->tag = sc->request->tag = dummy->tag; > - sc->request->special = sc; > + sc->host_scribble = (unsigned char *)dummy; > > return dummy->tag; > } > @@ -2286,7 +2286,7 @@ fnic_scsi_host_start_tag(struct fnic *fnic, struct scsi_cmnd *sc) > static inline void > fnic_scsi_host_end_tag(struct fnic *fnic, struct scsi_cmnd *sc) > { > - struct request *dummy = sc->request->special; > + struct request *dummy = (struct request *)sc->host_scribble; > > blk_mq_free_request(dummy); > } > The entire device_reset for fnic should be redone; which reminds me to redo my scsi-eh rework rebased. But until then: Reviewed-by: Hannes Reinecke <hare@suse.com> Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@suse.de +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg) ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 2/6] nullb: remove leftover legacy request code 2018-11-09 18:32 remove most req->special users Christoph Hellwig 2018-11-09 18:32 ` [PATCH 1/6] fnic: fix fnic_scsi_host_{start,end}_tag Christoph Hellwig @ 2018-11-09 18:32 ` Christoph Hellwig 2018-11-10 12:56 ` Hannes Reinecke 2018-11-09 18:32 ` [PATCH 3/6] skd_main: don't use req->special Christoph Hellwig ` (4 subsequent siblings) 6 siblings, 1 reply; 16+ messages in thread From: Christoph Hellwig @ 2018-11-09 18:32 UTC (permalink / raw) To: Jens Axboe; +Cc: linux-block null_softirq_done_fn is only used for the blk-mq path, so remove the other branch. Also rename the function to better match the method name. Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/block/null_blk_main.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/block/null_blk_main.c b/drivers/block/null_blk_main.c index 9c045bee0985..16ba3db2a015 100644 --- a/drivers/block/null_blk_main.c +++ b/drivers/block/null_blk_main.c @@ -642,14 +642,11 @@ static void null_cmd_end_timer(struct nullb_cmd *cmd) hrtimer_start(&cmd->timer, kt, HRTIMER_MODE_REL); } -static void null_softirq_done_fn(struct request *rq) +static void null_complete_rq(struct request *rq) { struct nullb *nullb = rq->q->queuedata; - if (nullb->dev->queue_mode == NULL_Q_MQ) - end_cmd(blk_mq_rq_to_pdu(rq)); - else - end_cmd(rq->special); + end_cmd(blk_mq_rq_to_pdu(rq)); } static struct nullb_page *null_alloc_page(gfp_t gfp_flags) @@ -1357,7 +1354,7 @@ static blk_status_t null_queue_rq(struct blk_mq_hw_ctx *hctx, static const struct blk_mq_ops null_mq_ops = { .queue_rq = null_queue_rq, - .complete = null_softirq_done_fn, + .complete = null_complete_rq, .timeout = null_timeout_rq, }; -- 2.19.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 2/6] nullb: remove leftover legacy request code 2018-11-09 18:32 ` [PATCH 2/6] nullb: remove leftover legacy request code Christoph Hellwig @ 2018-11-10 12:56 ` Hannes Reinecke 0 siblings, 0 replies; 16+ messages in thread From: Hannes Reinecke @ 2018-11-10 12:56 UTC (permalink / raw) To: Christoph Hellwig, Jens Axboe; +Cc: linux-block On 11/9/18 7:32 PM, Christoph Hellwig wrote: > null_softirq_done_fn is only used for the blk-mq path, so remove the > other branch. Also rename the function to better match the method name. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > drivers/block/null_blk_main.c | 9 +++------ > 1 file changed, 3 insertions(+), 6 deletions(-) > Reviewed-by: Hannes Reinecke <hare@suse.com> Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@suse.de +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg) ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 3/6] skd_main: don't use req->special 2018-11-09 18:32 remove most req->special users Christoph Hellwig 2018-11-09 18:32 ` [PATCH 1/6] fnic: fix fnic_scsi_host_{start,end}_tag Christoph Hellwig 2018-11-09 18:32 ` [PATCH 2/6] nullb: remove leftover legacy request code Christoph Hellwig @ 2018-11-09 18:32 ` Christoph Hellwig 2018-11-09 19:09 ` Bart Van Assche 2018-11-10 12:57 ` Hannes Reinecke 2018-11-09 18:32 ` [PATCH 4/6] aoe: replace ->special use with private data in the request Christoph Hellwig ` (3 subsequent siblings) 6 siblings, 2 replies; 16+ messages in thread From: Christoph Hellwig @ 2018-11-09 18:32 UTC (permalink / raw) To: Jens Axboe; +Cc: linux-block Add a retries field to the internal request structure instead, which gets set to zero on the first submission. Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/block/skd_main.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c index a0196477165f..88f29b06d90e 100644 --- a/drivers/block/skd_main.c +++ b/drivers/block/skd_main.c @@ -181,6 +181,7 @@ struct skd_request_context { struct fit_completion_entry_v1 completion; struct fit_comp_error_info err_info; + int retries; blk_status_t status; }; @@ -495,6 +496,11 @@ static blk_status_t skd_mq_queue_rq(struct blk_mq_hw_ctx *hctx, if (unlikely(skdev->state != SKD_DRVR_STATE_ONLINE)) return skd_fail_all(q) ? BLK_STS_IOERR : BLK_STS_RESOURCE; + if (!(req->rq_flags & RQF_DONTPREP)) { + skreq->retries = 0; + req->rq_flags |= RQF_DONTPREP; + } + blk_mq_start_request(req); WARN_ONCE(tag >= skd_max_queue_depth, "%#x > %#x (nr_requests = %lu)\n", @@ -1426,7 +1432,7 @@ static void skd_resolve_req_exception(struct skd_device *skdev, break; case SKD_CHECK_STATUS_REQUEUE_REQUEST: - if ((unsigned long) ++req->special < SKD_MAX_RETRIES) { + if ((unsigned long) skreq->retries < SKD_MAX_RETRIES) { skd_log_skreq(skdev, skreq, "retry"); blk_mq_requeue_request(req, true); break; -- 2.19.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 3/6] skd_main: don't use req->special 2018-11-09 18:32 ` [PATCH 3/6] skd_main: don't use req->special Christoph Hellwig @ 2018-11-09 19:09 ` Bart Van Assche 2018-11-10 12:57 ` Hannes Reinecke 1 sibling, 0 replies; 16+ messages in thread From: Bart Van Assche @ 2018-11-09 19:09 UTC (permalink / raw) To: Christoph Hellwig, Jens Axboe; +Cc: linux-block On 11/9/18 10:32 AM, Christoph Hellwig wrote: > Add a retries field to the internal request structure instead, which gets > set to zero on the first submission. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > drivers/block/skd_main.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c > index a0196477165f..88f29b06d90e 100644 > --- a/drivers/block/skd_main.c > +++ b/drivers/block/skd_main.c > @@ -181,6 +181,7 @@ struct skd_request_context { > struct fit_completion_entry_v1 completion; > > struct fit_comp_error_info err_info; > + int retries; > > blk_status_t status; > }; > @@ -495,6 +496,11 @@ static blk_status_t skd_mq_queue_rq(struct blk_mq_hw_ctx *hctx, > if (unlikely(skdev->state != SKD_DRVR_STATE_ONLINE)) > return skd_fail_all(q) ? BLK_STS_IOERR : BLK_STS_RESOURCE; > > + if (!(req->rq_flags & RQF_DONTPREP)) { > + skreq->retries = 0; > + req->rq_flags |= RQF_DONTPREP; > + } > + > blk_mq_start_request(req); > > WARN_ONCE(tag >= skd_max_queue_depth, "%#x > %#x (nr_requests = %lu)\n", > @@ -1426,7 +1432,7 @@ static void skd_resolve_req_exception(struct skd_device *skdev, > break; > > case SKD_CHECK_STATUS_REQUEUE_REQUEST: > - if ((unsigned long) ++req->special < SKD_MAX_RETRIES) { > + if ((unsigned long) skreq->retries < SKD_MAX_RETRIES) { > skd_log_skreq(skdev, skreq, "retry"); > blk_mq_requeue_request(req, true); > break; Hi Christoph, Where has the code been moved to that increments the new skreq->retries counter? Thanks, Bart. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 3/6] skd_main: don't use req->special 2018-11-09 18:32 ` [PATCH 3/6] skd_main: don't use req->special Christoph Hellwig 2018-11-09 19:09 ` Bart Van Assche @ 2018-11-10 12:57 ` Hannes Reinecke 1 sibling, 0 replies; 16+ messages in thread From: Hannes Reinecke @ 2018-11-10 12:57 UTC (permalink / raw) To: Christoph Hellwig, Jens Axboe; +Cc: linux-block On 11/9/18 7:32 PM, Christoph Hellwig wrote: > Add a retries field to the internal request structure instead, which gets > set to zero on the first submission. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > drivers/block/skd_main.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > Reviewed-by: Hannes Reinecke <hare@suse.com> Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@suse.de +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg) ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 4/6] aoe: replace ->special use with private data in the request 2018-11-09 18:32 remove most req->special users Christoph Hellwig ` (2 preceding siblings ...) 2018-11-09 18:32 ` [PATCH 3/6] skd_main: don't use req->special Christoph Hellwig @ 2018-11-09 18:32 ` Christoph Hellwig 2018-11-10 12:58 ` Hannes Reinecke 2018-11-09 18:32 ` [PATCH 5/6] pd: " Christoph Hellwig ` (2 subsequent siblings) 6 siblings, 1 reply; 16+ messages in thread From: Christoph Hellwig @ 2018-11-09 18:32 UTC (permalink / raw) To: Jens Axboe; +Cc: linux-block Makes the code a whole lot better to read.. Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/block/aoe/aoe.h | 4 ++++ drivers/block/aoe/aoeblk.c | 1 + drivers/block/aoe/aoecmd.c | 27 +++++++++------------------ drivers/block/aoe/aoedev.c | 11 ++++++----- 4 files changed, 20 insertions(+), 23 deletions(-) diff --git a/drivers/block/aoe/aoe.h b/drivers/block/aoe/aoe.h index 7ca76ed2e71a..84d0fcebd6af 100644 --- a/drivers/block/aoe/aoe.h +++ b/drivers/block/aoe/aoe.h @@ -100,6 +100,10 @@ enum { MAX_TAINT = 1000, /* cap on aoetgt taint */ }; +struct aoe_req { + unsigned long nr_bios; +}; + struct buf { ulong nframesout; struct bio *bio; diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c index ed26b7287256..e2c6aae2d636 100644 --- a/drivers/block/aoe/aoeblk.c +++ b/drivers/block/aoe/aoeblk.c @@ -387,6 +387,7 @@ aoeblk_gdalloc(void *vp) set = &d->tag_set; set->ops = &aoeblk_mq_ops; + set->cmd_size = sizeof(struct aoe_req); set->nr_hw_queues = 1; set->queue_depth = 128; set->numa_node = NUMA_NO_NODE; diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index bb2fba651bd2..3cf9bc5d8d95 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c @@ -822,17 +822,6 @@ rexmit_timer(struct timer_list *timer) spin_unlock_irqrestore(&d->lock, flags); } -static unsigned long -rqbiocnt(struct request *r) -{ - struct bio *bio; - unsigned long n = 0; - - __rq_for_each_bio(bio, r) - n++; - return n; -} - static void bufinit(struct buf *buf, struct request *rq, struct bio *bio) { @@ -847,6 +836,7 @@ nextbuf(struct aoedev *d) { struct request *rq; struct request_queue *q; + struct aoe_req *req; struct buf *buf; struct bio *bio; @@ -865,7 +855,11 @@ nextbuf(struct aoedev *d) blk_mq_start_request(rq); d->ip.rq = rq; d->ip.nxbio = rq->bio; - rq->special = (void *) rqbiocnt(rq); + + req = blk_mq_rq_to_pdu(rq); + req->nr_bios = 0; + __rq_for_each_bio(bio, rq) + req->nr_bios++; } buf = mempool_alloc(d->bufpool, GFP_ATOMIC); if (buf == NULL) { @@ -1069,16 +1063,13 @@ aoe_end_request(struct aoedev *d, struct request *rq, int fastfail) static void aoe_end_buf(struct aoedev *d, struct buf *buf) { - struct request *rq; - unsigned long n; + struct request *rq = buf->rq; + struct aoe_req *req = blk_mq_rq_to_pdu(rq); if (buf == d->ip.buf) d->ip.buf = NULL; - rq = buf->rq; mempool_free(buf, d->bufpool); - n = (unsigned long) rq->special; - rq->special = (void *) --n; - if (n == 0) + if (--req->nr_bios == 0) aoe_end_request(d, rq, 0); } diff --git a/drivers/block/aoe/aoedev.c b/drivers/block/aoe/aoedev.c index 9063f8efbd3b..5b49f1b33ebe 100644 --- a/drivers/block/aoe/aoedev.c +++ b/drivers/block/aoe/aoedev.c @@ -160,21 +160,22 @@ static void aoe_failip(struct aoedev *d) { struct request *rq; + struct aoe_req *req; struct bio *bio; - unsigned long n; aoe_failbuf(d, d->ip.buf); - rq = d->ip.rq; if (rq == NULL) return; + + req = blk_mq_rq_to_pdu(rq); while ((bio = d->ip.nxbio)) { bio->bi_status = BLK_STS_IOERR; d->ip.nxbio = bio->bi_next; - n = (unsigned long) rq->special; - rq->special = (void *) --n; + req->nr_bios--; } - if ((unsigned long) rq->special == 0) + + if (!req->nr_bios) aoe_end_request(d, rq, 0); } -- 2.19.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 4/6] aoe: replace ->special use with private data in the request 2018-11-09 18:32 ` [PATCH 4/6] aoe: replace ->special use with private data in the request Christoph Hellwig @ 2018-11-10 12:58 ` Hannes Reinecke 0 siblings, 0 replies; 16+ messages in thread From: Hannes Reinecke @ 2018-11-10 12:58 UTC (permalink / raw) To: Christoph Hellwig, Jens Axboe; +Cc: linux-block On 11/9/18 7:32 PM, Christoph Hellwig wrote: > Makes the code a whole lot better to read.. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > drivers/block/aoe/aoe.h | 4 ++++ > drivers/block/aoe/aoeblk.c | 1 + > drivers/block/aoe/aoecmd.c | 27 +++++++++------------------ > drivers/block/aoe/aoedev.c | 11 ++++++----- > 4 files changed, 20 insertions(+), 23 deletions(-) > Reviewed-by: Hannes Reinecke <hare@suse.com> Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@suse.de +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg) ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 5/6] pd: replace ->special use with private data in the request 2018-11-09 18:32 remove most req->special users Christoph Hellwig ` (3 preceding siblings ...) 2018-11-09 18:32 ` [PATCH 4/6] aoe: replace ->special use with private data in the request Christoph Hellwig @ 2018-11-09 18:32 ` Christoph Hellwig 2018-11-10 12:58 ` Hannes Reinecke 2018-11-09 18:32 ` [PATCH 6/6] ide: don't use req->special Christoph Hellwig 2018-11-09 22:47 ` remove most req->special users Jens Axboe 6 siblings, 1 reply; 16+ messages in thread From: Christoph Hellwig @ 2018-11-09 18:32 UTC (permalink / raw) To: Jens Axboe; +Cc: linux-block Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/block/paride/pd.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index ae4971e5d9a8..0ff9b12d0e35 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c @@ -242,6 +242,11 @@ struct pd_unit { static struct pd_unit pd[PD_UNITS]; +struct pd_req { + /* for REQ_OP_DRV_IN: */ + enum action (*func)(struct pd_unit *disk); +}; + static char pd_scratch[512]; /* scratch block buffer */ static char *pd_errs[17] = { "ERR", "INDEX", "ECC", "DRQ", "SEEK", "WRERR", @@ -502,8 +507,9 @@ static enum action do_pd_io_start(void) static enum action pd_special(void) { - enum action (*func)(struct pd_unit *) = pd_req->special; - return func(pd_current); + struct pd_req *req = blk_mq_rq_to_pdu(pd_req); + + return req->func(pd_current); } static int pd_next_buf(void) @@ -767,12 +773,14 @@ static int pd_special_command(struct pd_unit *disk, enum action (*func)(struct pd_unit *disk)) { struct request *rq; + struct pd_req *req; rq = blk_get_request(disk->gd->queue, REQ_OP_DRV_IN, 0); if (IS_ERR(rq)) return PTR_ERR(rq); + req = blk_mq_rq_to_pdu(rq); - rq->special = func; + req->func = func; blk_execute_rq(disk->gd->queue, disk->gd, rq, 0); blk_put_request(rq); return 0; @@ -892,9 +900,21 @@ static void pd_probe_drive(struct pd_unit *disk) disk->gd = p; p->private_data = disk; - p->queue = blk_mq_init_sq_queue(&disk->tag_set, &pd_mq_ops, 2, - BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING); + memset(&disk->tag_set, 0, sizeof(disk->tag_set)); + disk->tag_set.ops = &pd_mq_ops; + disk->tag_set.cmd_size = sizeof(struct pd_req); + disk->tag_set.nr_hw_queues = 1; + disk->tag_set.nr_maps = 1; + disk->tag_set.queue_depth = 2; + disk->tag_set.numa_node = NUMA_NO_NODE; + disk->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING; + + if (blk_mq_alloc_tag_set(&disk->tag_set)) + return; + + p->queue = blk_mq_init_queue(&disk->tag_set); if (IS_ERR(p->queue)) { + blk_mq_free_tag_set(&disk->tag_set); p->queue = NULL; return; } -- 2.19.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 5/6] pd: replace ->special use with private data in the request 2018-11-09 18:32 ` [PATCH 5/6] pd: " Christoph Hellwig @ 2018-11-10 12:58 ` Hannes Reinecke 0 siblings, 0 replies; 16+ messages in thread From: Hannes Reinecke @ 2018-11-10 12:58 UTC (permalink / raw) To: Christoph Hellwig, Jens Axboe; +Cc: linux-block On 11/9/18 7:32 PM, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > drivers/block/paride/pd.c | 30 +++++++++++++++++++++++++----- > 1 file changed, 25 insertions(+), 5 deletions(-) > Reviewed-by: Hannes Reinecke <hare@suse.com> Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@suse.de +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg) ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 6/6] ide: don't use req->special 2018-11-09 18:32 remove most req->special users Christoph Hellwig ` (4 preceding siblings ...) 2018-11-09 18:32 ` [PATCH 5/6] pd: " Christoph Hellwig @ 2018-11-09 18:32 ` Christoph Hellwig 2018-11-10 12:59 ` Hannes Reinecke 2018-11-09 22:47 ` remove most req->special users Jens Axboe 6 siblings, 1 reply; 16+ messages in thread From: Christoph Hellwig @ 2018-11-09 18:32 UTC (permalink / raw) To: Jens Axboe; +Cc: linux-block Just replace it with a field of the same name in struct ide_req. Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/ide/ide-atapi.c | 4 ++-- drivers/ide/ide-cd.c | 4 ++-- drivers/ide/ide-devsets.c | 4 ++-- drivers/ide/ide-disk.c | 6 +++--- drivers/ide/ide-eh.c | 2 +- drivers/ide/ide-floppy.c | 2 +- drivers/ide/ide-io.c | 14 +++++++++----- drivers/ide/ide-park.c | 4 ++-- drivers/ide/ide-pm.c | 12 ++++++------ drivers/ide/ide-tape.c | 2 +- drivers/ide/ide-taskfile.c | 2 +- include/linux/ide.h | 1 + 12 files changed, 31 insertions(+), 26 deletions(-) diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index 33210bc67618..da58020a144e 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c @@ -94,7 +94,7 @@ int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk, rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0); ide_req(rq)->type = ATA_PRIV_MISC; - rq->special = (char *)pc; + ide_req(rq)->special = pc; if (buf && bufflen) { error = blk_rq_map_kern(drive->queue, rq, buf, bufflen, @@ -244,7 +244,7 @@ int ide_queue_sense_rq(ide_drive_t *drive, void *special) return -ENOMEM; } - sense_rq->special = special; + ide_req(sense_rq)->special = special; drive->sense_rq_armed = false; drive->hwif->rq = NULL; diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 4ecaf2ace4cb..fb24093c9aa6 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -211,12 +211,12 @@ static void cdrom_analyze_sense_data(ide_drive_t *drive, static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq) { /* - * For ATA_PRIV_SENSE, "rq->special" points to the original + * For ATA_PRIV_SENSE, "ide_req(rq)->special" points to the original * failed request. Also, the sense data should be read * directly from rq which might be different from the original * sense buffer if it got copied during mapping. */ - struct request *failed = (struct request *)rq->special; + struct request *failed = ide_req(rq)->special; void *sense = bio_data(rq->bio); if (failed) { diff --git a/drivers/ide/ide-devsets.c b/drivers/ide/ide-devsets.c index f4f8afdf8bbe..f2f93ed40356 100644 --- a/drivers/ide/ide-devsets.c +++ b/drivers/ide/ide-devsets.c @@ -171,7 +171,7 @@ int ide_devset_execute(ide_drive_t *drive, const struct ide_devset *setting, scsi_req(rq)->cmd_len = 5; scsi_req(rq)->cmd[0] = REQ_DEVSET_EXEC; *(int *)&scsi_req(rq)->cmd[1] = arg; - rq->special = setting->set; + ide_req(rq)->special = setting->set; blk_execute_rq(q, NULL, rq, 0); ret = scsi_req(rq)->result; @@ -182,7 +182,7 @@ int ide_devset_execute(ide_drive_t *drive, const struct ide_devset *setting, ide_startstop_t ide_do_devset(ide_drive_t *drive, struct request *rq) { - int err, (*setfunc)(ide_drive_t *, int) = rq->special; + int err, (*setfunc)(ide_drive_t *, int) = ide_req(rq)->special; err = setfunc(drive, *(int *)&scsi_req(rq)->cmd[1]); if (err) diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index f8567c8c9dd1..1333d291cb19 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -434,8 +434,8 @@ static int idedisk_prep_fn(ide_drive_t *drive, struct request *rq) if (req_op(rq) != REQ_OP_FLUSH) return BLKPREP_OK; - if (rq->special) { - cmd = rq->special; + if (ide_req(rq)->special) { + cmd = ide_req(rq)->special; memset(cmd, 0, sizeof(*cmd)); } else { cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); @@ -455,7 +455,7 @@ static int idedisk_prep_fn(ide_drive_t *drive, struct request *rq) rq->cmd_flags &= ~REQ_OP_MASK; rq->cmd_flags |= REQ_OP_DRV_OUT; ide_req(rq)->type = ATA_PRIV_TASKFILE; - rq->special = cmd; + ide_req(rq)->special = cmd; cmd->rq = rq; return BLKPREP_OK; diff --git a/drivers/ide/ide-eh.c b/drivers/ide/ide-eh.c index 47d5f3379748..e1323e058454 100644 --- a/drivers/ide/ide-eh.c +++ b/drivers/ide/ide-eh.c @@ -125,7 +125,7 @@ ide_startstop_t ide_error(ide_drive_t *drive, const char *msg, u8 stat) /* retry only "normal" I/O: */ if (blk_rq_is_passthrough(rq)) { if (ata_taskfile_request(rq)) { - struct ide_cmd *cmd = rq->special; + struct ide_cmd *cmd = ide_req(rq)->special; if (cmd) ide_complete_cmd(drive, cmd, stat, err); diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index a8df300f949c..780d33ccc5d8 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -276,7 +276,7 @@ static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive, switch (ide_req(rq)->type) { case ATA_PRIV_MISC: case ATA_PRIV_SENSE: - pc = (struct ide_atapi_pc *)rq->special; + pc = (struct ide_atapi_pc *)ide_req(rq)->special; break; default: BUG(); diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 5093c605c91c..11ffcc802929 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -111,7 +111,7 @@ void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err) } if (rq && ata_taskfile_request(rq)) { - struct ide_cmd *orig_cmd = rq->special; + struct ide_cmd *orig_cmd = ide_req(rq)->special; if (cmd->tf_flags & IDE_TFLAG_DYN) kfree(orig_cmd); @@ -261,7 +261,7 @@ EXPORT_SYMBOL_GPL(ide_init_sg_cmd); static ide_startstop_t execute_drive_cmd (ide_drive_t *drive, struct request *rq) { - struct ide_cmd *cmd = rq->special; + struct ide_cmd *cmd = ide_req(rq)->special; if (cmd) { if (cmd->protocol == ATA_PROT_PIO) { @@ -352,7 +352,7 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) if (ata_taskfile_request(rq)) return execute_drive_cmd(drive, rq); else if (ata_pm_request(rq)) { - struct ide_pm_state *pm = rq->special; + struct ide_pm_state *pm = ide_req(rq)->special; #ifdef DEBUG_PM printk("%s: start_power_step(step: %d)\n", drive->name, pm->pm_step); @@ -460,16 +460,20 @@ blk_status_t ide_queue_rq(struct blk_mq_hw_ctx *hctx, ide_drive_t *drive = hctx->queue->queuedata; ide_hwif_t *hwif = drive->hwif; struct ide_host *host = hwif->host; - struct request *rq = NULL; + struct request *rq = bd->rq; ide_startstop_t startstop; + if (!(rq->rq_flags & RQF_DONTPREP)) { + rq->rq_flags |= RQF_DONTPREP; + ide_req(rq)->special = NULL; + } + /* HLD do_request() callback might sleep, make sure it's okay */ might_sleep(); if (ide_lock_host(host, hwif)) return BLK_STS_DEV_RESOURCE; - rq = bd->rq; blk_mq_start_request(rq); spin_lock_irq(&hwif->lock); diff --git a/drivers/ide/ide-park.c b/drivers/ide/ide-park.c index de9e85cf74d1..102aa3bc3e7f 100644 --- a/drivers/ide/ide-park.c +++ b/drivers/ide/ide-park.c @@ -36,7 +36,7 @@ static void issue_park_cmd(ide_drive_t *drive, unsigned long timeout) scsi_req(rq)->cmd[0] = REQ_PARK_HEADS; scsi_req(rq)->cmd_len = 1; ide_req(rq)->type = ATA_PRIV_MISC; - rq->special = &timeout; + ide_req(rq)->special = &timeout; blk_execute_rq(q, NULL, rq, 1); rc = scsi_req(rq)->result ? -EIO : 0; blk_put_request(rq); @@ -67,7 +67,7 @@ ide_startstop_t ide_do_park_unpark(ide_drive_t *drive, struct request *rq) memset(&cmd, 0, sizeof(cmd)); if (scsi_req(rq)->cmd[0] == REQ_PARK_HEADS) { - drive->sleep = *(unsigned long *)rq->special; + drive->sleep = *(unsigned long *)ide_req(rq)->special; drive->dev_flags |= IDE_DFLAG_SLEEPING; tf->command = ATA_CMD_IDLEIMMEDIATE; tf->feature = 0x44; diff --git a/drivers/ide/ide-pm.c b/drivers/ide/ide-pm.c index ea10507e5190..a8c53c98252d 100644 --- a/drivers/ide/ide-pm.c +++ b/drivers/ide/ide-pm.c @@ -21,7 +21,7 @@ int generic_ide_suspend(struct device *dev, pm_message_t mesg) memset(&rqpm, 0, sizeof(rqpm)); rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0); ide_req(rq)->type = ATA_PRIV_PM_SUSPEND; - rq->special = &rqpm; + ide_req(rq)->special = &rqpm; rqpm.pm_step = IDE_PM_START_SUSPEND; if (mesg.event == PM_EVENT_PRETHAW) mesg.event = PM_EVENT_FREEZE; @@ -82,7 +82,7 @@ int generic_ide_resume(struct device *dev) memset(&rqpm, 0, sizeof(rqpm)); rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, BLK_MQ_REQ_PREEMPT); ide_req(rq)->type = ATA_PRIV_PM_RESUME; - rq->special = &rqpm; + ide_req(rq)->special = &rqpm; rqpm.pm_step = IDE_PM_START_RESUME; rqpm.pm_state = PM_EVENT_ON; @@ -101,7 +101,7 @@ int generic_ide_resume(struct device *dev) void ide_complete_power_step(ide_drive_t *drive, struct request *rq) { - struct ide_pm_state *pm = rq->special; + struct ide_pm_state *pm = ide_req(rq)->special; #ifdef DEBUG_PM printk(KERN_INFO "%s: complete_power_step(step: %d)\n", @@ -131,7 +131,7 @@ void ide_complete_power_step(ide_drive_t *drive, struct request *rq) ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq) { - struct ide_pm_state *pm = rq->special; + struct ide_pm_state *pm = ide_req(rq)->special; struct ide_cmd cmd = { }; switch (pm->pm_step) { @@ -203,7 +203,7 @@ ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq) void ide_complete_pm_rq(ide_drive_t *drive, struct request *rq) { struct request_queue *q = drive->queue; - struct ide_pm_state *pm = rq->special; + struct ide_pm_state *pm = ide_req(rq)->special; unsigned long flags; ide_complete_power_step(drive, rq); @@ -228,7 +228,7 @@ void ide_complete_pm_rq(ide_drive_t *drive, struct request *rq) void ide_check_pm_state(ide_drive_t *drive, struct request *rq) { - struct ide_pm_state *pm = rq->special; + struct ide_pm_state *pm = ide_req(rq)->special; if (blk_rq_is_private(rq) && ide_req(rq)->type == ATA_PRIV_PM_SUSPEND && diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 34c1165226a4..db1a65f4b490 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c @@ -639,7 +639,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, goto out; } if (req->cmd[13] & REQ_IDETAPE_PC1) { - pc = (struct ide_atapi_pc *)rq->special; + pc = (struct ide_atapi_pc *)ide_req(rq)->special; req->cmd[13] &= ~(REQ_IDETAPE_PC1); req->cmd[13] |= REQ_IDETAPE_PC2; goto out; diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index c21d5c50ae3a..17b2e379e872 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -440,7 +440,7 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf, goto put_req; } - rq->special = cmd; + ide_req(rq)->special = cmd; cmd->rq = rq; blk_execute_rq(drive->queue, NULL, rq, 0); diff --git a/include/linux/ide.h b/include/linux/ide.h index 079f8bc0b0f4..975c662e8707 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -50,6 +50,7 @@ struct ide_request { struct scsi_request sreq; u8 sense[SCSI_SENSE_BUFFERSIZE]; u8 type; + void *special; }; static inline struct ide_request *ide_req(struct request *rq) -- 2.19.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 6/6] ide: don't use req->special 2018-11-09 18:32 ` [PATCH 6/6] ide: don't use req->special Christoph Hellwig @ 2018-11-10 12:59 ` Hannes Reinecke 0 siblings, 0 replies; 16+ messages in thread From: Hannes Reinecke @ 2018-11-10 12:59 UTC (permalink / raw) To: Christoph Hellwig, Jens Axboe; +Cc: linux-block On 11/9/18 7:32 PM, Christoph Hellwig wrote: > Just replace it with a field of the same name in struct ide_req. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > drivers/ide/ide-atapi.c | 4 ++-- > drivers/ide/ide-cd.c | 4 ++-- > drivers/ide/ide-devsets.c | 4 ++-- > drivers/ide/ide-disk.c | 6 +++--- > drivers/ide/ide-eh.c | 2 +- > drivers/ide/ide-floppy.c | 2 +- > drivers/ide/ide-io.c | 14 +++++++++----- > drivers/ide/ide-park.c | 4 ++-- > drivers/ide/ide-pm.c | 12 ++++++------ > drivers/ide/ide-tape.c | 2 +- > drivers/ide/ide-taskfile.c | 2 +- > include/linux/ide.h | 1 + > 12 files changed, 31 insertions(+), 26 deletions(-) > Reviewed-by: Hannes Reinecke <hare@suse.com> Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@suse.de +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg) ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: remove most req->special users 2018-11-09 18:32 remove most req->special users Christoph Hellwig ` (5 preceding siblings ...) 2018-11-09 18:32 ` [PATCH 6/6] ide: don't use req->special Christoph Hellwig @ 2018-11-09 22:47 ` Jens Axboe 6 siblings, 0 replies; 16+ messages in thread From: Jens Axboe @ 2018-11-09 22:47 UTC (permalink / raw) To: Christoph Hellwig; +Cc: linux-block On 11/9/18 11:32 AM, Christoph Hellwig wrote: > Try to get rid of the req->special users so that we can remove this > field. With this series we basically only have the osd / scsi BIDI > code left, which should go away in another series. Outside of the typo in skd_main that Bart pointed out, the rest of it looks fine to me. Can you send a v2 with that fixed? -- Jens Axboe ^ permalink raw reply [flat|nested] 16+ messages in thread
* remove most req->special users v2 @ 2018-11-10 8:30 Christoph Hellwig 2018-11-10 8:30 ` [PATCH 3/6] skd_main: don't use req->special Christoph Hellwig 0 siblings, 1 reply; 16+ messages in thread From: Christoph Hellwig @ 2018-11-10 8:30 UTC (permalink / raw) To: Jens Axboe; +Cc: linux-block Try to get rid of the req->special users so that we can remove this field. With this series we basically only have the osd / scsi BIDI code left, which should go away in another series. Note that the first one is a bug fix for the blk-mq conversion series, I don't think the current fnic code can work, but this version is only compile tested as well. Changes since v1: - fix the retries counter in skd to actually work. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 3/6] skd_main: don't use req->special 2018-11-10 8:30 remove most req->special users v2 Christoph Hellwig @ 2018-11-10 8:30 ` Christoph Hellwig 0 siblings, 0 replies; 16+ messages in thread From: Christoph Hellwig @ 2018-11-10 8:30 UTC (permalink / raw) To: Jens Axboe; +Cc: linux-block Add a retries field to the internal request structure instead, which gets set to zero on the first submission. Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/block/skd_main.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c index a0196477165f..a10d5736d8f7 100644 --- a/drivers/block/skd_main.c +++ b/drivers/block/skd_main.c @@ -181,6 +181,7 @@ struct skd_request_context { struct fit_completion_entry_v1 completion; struct fit_comp_error_info err_info; + int retries; blk_status_t status; }; @@ -495,6 +496,11 @@ static blk_status_t skd_mq_queue_rq(struct blk_mq_hw_ctx *hctx, if (unlikely(skdev->state != SKD_DRVR_STATE_ONLINE)) return skd_fail_all(q) ? BLK_STS_IOERR : BLK_STS_RESOURCE; + if (!(req->rq_flags & RQF_DONTPREP)) { + skreq->retries = 0; + req->rq_flags |= RQF_DONTPREP; + } + blk_mq_start_request(req); WARN_ONCE(tag >= skd_max_queue_depth, "%#x > %#x (nr_requests = %lu)\n", @@ -1426,7 +1432,7 @@ static void skd_resolve_req_exception(struct skd_device *skdev, break; case SKD_CHECK_STATUS_REQUEUE_REQUEST: - if ((unsigned long) ++req->special < SKD_MAX_RETRIES) { + if (++skreq->retries < SKD_MAX_RETRIES) { skd_log_skreq(skdev, skreq, "retry"); blk_mq_requeue_request(req, true); break; -- 2.19.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
end of thread, other threads:[~2018-11-10 12:59 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-11-09 18:32 remove most req->special users Christoph Hellwig
2018-11-09 18:32 ` [PATCH 1/6] fnic: fix fnic_scsi_host_{start,end}_tag Christoph Hellwig
2018-11-10 12:56 ` Hannes Reinecke
2018-11-09 18:32 ` [PATCH 2/6] nullb: remove leftover legacy request code Christoph Hellwig
2018-11-10 12:56 ` Hannes Reinecke
2018-11-09 18:32 ` [PATCH 3/6] skd_main: don't use req->special Christoph Hellwig
2018-11-09 19:09 ` Bart Van Assche
2018-11-10 12:57 ` Hannes Reinecke
2018-11-09 18:32 ` [PATCH 4/6] aoe: replace ->special use with private data in the request Christoph Hellwig
2018-11-10 12:58 ` Hannes Reinecke
2018-11-09 18:32 ` [PATCH 5/6] pd: " Christoph Hellwig
2018-11-10 12:58 ` Hannes Reinecke
2018-11-09 18:32 ` [PATCH 6/6] ide: don't use req->special Christoph Hellwig
2018-11-10 12:59 ` Hannes Reinecke
2018-11-09 22:47 ` remove most req->special users Jens Axboe
-- strict thread matches above, loose matches on Subject: below --
2018-11-10 8:30 remove most req->special users v2 Christoph Hellwig
2018-11-10 8:30 ` [PATCH 3/6] skd_main: don't use req->special Christoph Hellwig
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).