From: Jens Axboe <axboe@kernel.dk>
To: Christoph Hellwig <hch@infradead.org>
Cc: Shaohua Li <shli@kernel.org>, linux-kernel@vger.kernel.org
Subject: Re: [patch]blk-mq: blk_mq_tag_to_rq should handle flush request
Date: Wed, 04 Jun 2014 09:47:14 -0600 [thread overview]
Message-ID: <538F3F82.5060805@kernel.dk> (raw)
In-Reply-To: <538F3DC4.4030104@kernel.dk>
[-- Attachment #1: Type: text/plain, Size: 1312 bytes --]
On 06/04/2014 09:39 AM, Jens Axboe wrote:
> On 06/04/2014 09:31 AM, Christoph Hellwig wrote:
>> On Wed, Jun 04, 2014 at 09:02:19AM -0600, Jens Axboe wrote:
>>>> scsi_mq_find_tag only gets the scsi host, which may have multiple
>>>> queues. When called from scsi_find_tag we actually have a scsi device,
>>>> so that's not an issue, but when called from scsi_host_find_tag the
>>>> driver only provides the host.
>>>
>>> Only solution I see right now is to have the flush_rq in the shared
>>> tags, but that would potentially be a regression for multiple
>>> devices and heavy flush uses cases. I'll see if I can come up with
>>> something better, or maybe Shaohua has an idea.
>>
>> What about something like the following (untest, uncompiled, maybe
>> pseudo-code):
>>
>> struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag)
>> {
>> struct request *rq = tags->rqs[tag];
>>
>> if ((rq->cmd_flags & REQ_FLUSH_SEQ) && rq->q->flush_rq->tag == tag)
>> return rq->q->flush_rq;
>> return rq;
>
> Ah yes, that'll work, the queue is always assigned. I'll make that change.
Something like this in complete form. Compile tested only, I'll test it
on dev box. Probably doesn't matter too much, but I prefer to
potentially have the faster path (non-flush) just fall inline.
--
Jens Axboe
[-- Attachment #2: tag-to-request.patch --]
[-- Type: text/x-patch, Size: 2579 bytes --]
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 4e8e8cf00815..4e4cd6208052 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -529,15 +529,20 @@ void blk_mq_kick_requeue_list(struct request_queue *q)
}
EXPORT_SYMBOL(blk_mq_kick_requeue_list);
-struct request *blk_mq_tag_to_rq(struct blk_mq_hw_ctx *hctx, unsigned int tag)
+static inline bool is_flush_request(struct request *rq, unsigned int tag)
{
- struct request_queue *q = hctx->queue;
+ return ((rq->cmd_flags & REQ_FLUSH_SEQ) &&
+ rq->q->flush_rq->tag == tag);
+}
- if ((q->flush_rq->cmd_flags & REQ_FLUSH_SEQ) &&
- q->flush_rq->tag == tag)
- return q->flush_rq;
+struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag)
+{
+ struct request *rq = tags->rqs[tag];
+
+ if (!is_flush_request(rq, tag))
+ return rq;
- return hctx->tags->rqs[tag];
+ return rq->q->flush_rq;
}
EXPORT_SYMBOL(blk_mq_tag_to_rq);
@@ -566,7 +571,7 @@ static void blk_mq_timeout_check(void *__data, unsigned long *free_tags)
if (tag >= hctx->tags->nr_tags)
break;
- rq = blk_mq_tag_to_rq(hctx, tag++);
+ rq = blk_mq_tag_to_rq(hctx->tags, tag++);
if (rq->q != hctx->queue)
continue;
if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags))
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c
index abc858b3528b..74abd49fabdc 100644
--- a/drivers/block/mtip32xx/mtip32xx.c
+++ b/drivers/block/mtip32xx/mtip32xx.c
@@ -193,7 +193,9 @@ static void mtip_put_int_command(struct driver_data *dd, struct mtip_cmd *cmd)
static struct request *mtip_rq_from_tag(struct driver_data *dd,
unsigned int tag)
{
- return blk_mq_tag_to_rq(dd->queue->queue_hw_ctx[0], tag);
+ struct blk_mq_hw_ctx *hctx = dd->queue->queue_hw_ctx[0];
+
+ return blk_mq_tag_to_rq(hctx->tags, tag);
}
static struct mtip_cmd *mtip_cmd_from_tag(struct driver_data *dd,
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index c15128833100..0feedebfde48 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -155,7 +155,7 @@ void blk_mq_free_request(struct request *rq);
bool blk_mq_can_queue(struct blk_mq_hw_ctx *);
struct request *blk_mq_alloc_request(struct request_queue *q, int rw,
gfp_t gfp, bool reserved);
-struct request *blk_mq_tag_to_rq(struct blk_mq_hw_ctx *hctx, unsigned int tag);
+struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag);
struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *, const int ctx_index);
struct blk_mq_hw_ctx *blk_mq_alloc_single_hw_queue(struct blk_mq_tag_set *, unsigned int, int);
next prev parent reply other threads:[~2014-06-04 15:47 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-09 12:07 [patch]blk-mq: blk_mq_tag_to_rq should handle flush request Shaohua Li
2014-05-09 15:00 ` Christoph Hellwig
2014-05-10 4:00 ` Shaohua Li
2014-05-11 17:40 ` Jens Axboe
2014-05-30 14:09 ` Jens Axboe
2014-06-04 11:11 ` Christoph Hellwig
2014-06-04 14:15 ` Jens Axboe
2014-06-04 14:20 ` Christoph Hellwig
2014-06-04 14:54 ` Jens Axboe
2014-06-04 14:58 ` Christoph Hellwig
2014-06-04 15:02 ` Jens Axboe
2014-06-04 15:05 ` Christoph Hellwig
2014-06-04 15:08 ` Jens Axboe
2014-06-04 15:10 ` Christoph Hellwig
2014-06-04 15:11 ` Jens Axboe
2014-06-04 15:16 ` Christoph Hellwig
2014-06-04 15:19 ` Jens Axboe
2014-06-04 15:22 ` Christoph Hellwig
2014-06-04 15:28 ` Jens Axboe
2014-06-04 15:31 ` Christoph Hellwig
2014-06-04 15:39 ` Jens Axboe
2014-06-04 15:47 ` Jens Axboe [this message]
2014-06-04 16:25 ` Jens Axboe
2014-06-05 1:27 ` Shaohua Li
2014-06-05 2:05 ` Jens Axboe
2014-06-05 2:27 ` Shaohua Li
2014-06-05 2:40 ` Jens Axboe
2014-06-04 15:43 ` Ming Lei
2014-06-04 15:48 ` Jens Axboe
2014-06-04 16:00 ` Ming Lei
2014-06-04 16:09 ` Jens Axboe
2014-06-04 16:26 ` Ming Lei
2014-06-04 16:28 ` Jens Axboe
2014-06-04 16:33 ` Christoph Hellwig
2014-06-04 16:36 ` Ming Lei
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=538F3F82.5060805@kernel.dk \
--to=axboe@kernel.dk \
--cc=hch@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=shli@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.