Commit 415b806d authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Jens Axboe

blk-mq-sched: Allocate sched reserved tags as specified in the original queue tagset

Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>

Modified by me to also check at driver tag allocation time if the
original request was reserved, so we can be sure to allocate a
properly reserved tag at that point in time, too.
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent d3af3ecd
...@@ -454,7 +454,8 @@ int blk_mq_sched_setup(struct request_queue *q) ...@@ -454,7 +454,8 @@ int blk_mq_sched_setup(struct request_queue *q)
*/ */
ret = 0; ret = 0;
queue_for_each_hw_ctx(q, hctx, i) { queue_for_each_hw_ctx(q, hctx, i) {
hctx->sched_tags = blk_mq_alloc_rq_map(set, i, q->nr_requests, 0); hctx->sched_tags = blk_mq_alloc_rq_map(set, i,
q->nr_requests, set->reserved_tags);
if (!hctx->sched_tags) { if (!hctx->sched_tags) {
ret = -ENOMEM; ret = -ENOMEM;
break; break;
......
...@@ -181,7 +181,7 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) ...@@ -181,7 +181,7 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data)
void blk_mq_put_tag(struct blk_mq_hw_ctx *hctx, struct blk_mq_tags *tags, void blk_mq_put_tag(struct blk_mq_hw_ctx *hctx, struct blk_mq_tags *tags,
struct blk_mq_ctx *ctx, unsigned int tag) struct blk_mq_ctx *ctx, unsigned int tag)
{ {
if (tag >= tags->nr_reserved_tags) { if (!blk_mq_tag_is_reserved(tags, tag)) {
const int real_tag = tag - tags->nr_reserved_tags; const int real_tag = tag - tags->nr_reserved_tags;
BUG_ON(real_tag >= tags->nr_tags); BUG_ON(real_tag >= tags->nr_tags);
......
...@@ -85,4 +85,10 @@ static inline void blk_mq_tag_set_rq(struct blk_mq_hw_ctx *hctx, ...@@ -85,4 +85,10 @@ static inline void blk_mq_tag_set_rq(struct blk_mq_hw_ctx *hctx,
hctx->tags->rqs[tag] = rq; hctx->tags->rqs[tag] = rq;
} }
static inline bool blk_mq_tag_is_reserved(struct blk_mq_tags *tags,
unsigned int tag)
{
return tag < tags->nr_reserved_tags;
}
#endif #endif
...@@ -852,6 +852,9 @@ bool blk_mq_get_driver_tag(struct request *rq, struct blk_mq_hw_ctx **hctx, ...@@ -852,6 +852,9 @@ bool blk_mq_get_driver_tag(struct request *rq, struct blk_mq_hw_ctx **hctx,
return true; return true;
} }
if (blk_mq_tag_is_reserved(data.hctx->sched_tags, rq->internal_tag))
data.flags |= BLK_MQ_REQ_RESERVED;
rq->tag = blk_mq_get_tag(&data); rq->tag = blk_mq_get_tag(&data);
if (rq->tag >= 0) { if (rq->tag >= 0) {
if (blk_mq_tag_busy(data.hctx)) { if (blk_mq_tag_busy(data.hctx)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment