blk-mq: save default hctx into ctx->hctxs for not-supported type
Currently, we check whether the hctx type is supported every time in hot path. Actually, this is not necessary, we could save the default hctx into ctx->hctxs if the type is not supported when map swqueues and use it directly with ctx->hctxs[type]. We also needn't check whether the poll is enabled or not, because the caller would clear the REQ_HIPRI in that case. Signed-off-by: Jianchao Wang <jianchao.w.wang@oracle.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>hifive-unleashed-5.1
parent
8ccdf4a377
commit
bb94aea144
|
@ -2431,8 +2431,11 @@ static void blk_mq_map_swqueue(struct request_queue *q)
|
||||||
|
|
||||||
ctx = per_cpu_ptr(q->queue_ctx, i);
|
ctx = per_cpu_ptr(q->queue_ctx, i);
|
||||||
for (j = 0; j < set->nr_maps; j++) {
|
for (j = 0; j < set->nr_maps; j++) {
|
||||||
if (!set->map[j].nr_queues)
|
if (!set->map[j].nr_queues) {
|
||||||
|
ctx->hctxs[j] = blk_mq_map_queue_type(q,
|
||||||
|
HCTX_TYPE_DEFAULT, i);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
hctx = blk_mq_map_queue_type(q, j, i);
|
hctx = blk_mq_map_queue_type(q, j, i);
|
||||||
ctx->hctxs[j] = hctx;
|
ctx->hctxs[j] = hctx;
|
||||||
|
@ -2455,6 +2458,10 @@ static void blk_mq_map_swqueue(struct request_queue *q)
|
||||||
*/
|
*/
|
||||||
BUG_ON(!hctx->nr_ctx);
|
BUG_ON(!hctx->nr_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (; j < HCTX_MAX_TYPES; j++)
|
||||||
|
ctx->hctxs[j] = blk_mq_map_queue_type(q,
|
||||||
|
HCTX_TYPE_DEFAULT, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&q->sysfs_lock);
|
mutex_unlock(&q->sysfs_lock);
|
||||||
|
|
|
@ -106,15 +106,12 @@ static inline struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *q,
|
||||||
{
|
{
|
||||||
enum hctx_type type = HCTX_TYPE_DEFAULT;
|
enum hctx_type type = HCTX_TYPE_DEFAULT;
|
||||||
|
|
||||||
if ((flags & REQ_HIPRI) &&
|
/*
|
||||||
q->tag_set->nr_maps > HCTX_TYPE_POLL &&
|
* The caller ensure that if REQ_HIPRI, poll must be enabled.
|
||||||
q->tag_set->map[HCTX_TYPE_POLL].nr_queues &&
|
*/
|
||||||
test_bit(QUEUE_FLAG_POLL, &q->queue_flags))
|
if (flags & REQ_HIPRI)
|
||||||
type = HCTX_TYPE_POLL;
|
type = HCTX_TYPE_POLL;
|
||||||
|
else if ((flags & REQ_OP_MASK) == REQ_OP_READ)
|
||||||
else if (((flags & REQ_OP_MASK) == REQ_OP_READ) &&
|
|
||||||
q->tag_set->nr_maps > HCTX_TYPE_READ &&
|
|
||||||
q->tag_set->map[HCTX_TYPE_READ].nr_queues)
|
|
||||||
type = HCTX_TYPE_READ;
|
type = HCTX_TYPE_READ;
|
||||||
|
|
||||||
return ctx->hctxs[type];
|
return ctx->hctxs[type];
|
||||||
|
|
Loading…
Reference in New Issue