blk-mq: cleanup shared tags case in blk_mq_update_nr_requests()

For shared tags case, all hctx->sched_tags/tags are the same, it doesn't
make sense to call into blk_mq_tag_update_depth() multiple times for the
same tags.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Yu Kuai 2025-09-10 16:04:40 +08:00 committed by Jens Axboe
parent 626ff4f8eb
commit 7f2799c546
2 changed files with 22 additions and 28 deletions

View File

@ -622,13 +622,6 @@ int blk_mq_tag_update_depth(struct blk_mq_hw_ctx *hctx,
struct blk_mq_tag_set *set = hctx->queue->tag_set; struct blk_mq_tag_set *set = hctx->queue->tag_set;
struct blk_mq_tags *new; struct blk_mq_tags *new;
/*
* Only the sbitmap needs resizing since we allocated the max
* initially.
*/
if (blk_mq_is_shared_tags(set->flags))
return 0;
new = blk_mq_alloc_map_and_rqs(set, hctx->queue_num, tdepth); new = blk_mq_alloc_map_and_rqs(set, hctx->queue_num, tdepth);
if (!new) if (!new)
return -ENOMEM; return -ENOMEM;

View File

@ -4935,34 +4935,35 @@ int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr)
blk_mq_quiesce_queue(q); blk_mq_quiesce_queue(q);
queue_for_each_hw_ctx(q, hctx, i) {
if (!hctx->tags)
continue;
/*
* If we're using an MQ scheduler, just update the scheduler
* queue depth. This is similar to what the old code would do.
*/
if (hctx->sched_tags) {
ret = blk_mq_tag_update_depth(hctx, &hctx->sched_tags,
nr);
} else {
ret = blk_mq_tag_update_depth(hctx, &hctx->tags, nr);
}
if (ret)
goto out;
}
q->nr_requests = nr;
if (q->elevator && q->elevator->type->ops.depth_updated)
q->elevator->type->ops.depth_updated(q);
if (blk_mq_is_shared_tags(set->flags)) { if (blk_mq_is_shared_tags(set->flags)) {
if (q->elevator) if (q->elevator)
blk_mq_tag_update_sched_shared_tags(q); blk_mq_tag_update_sched_shared_tags(q);
else else
blk_mq_tag_resize_shared_tags(set, nr); blk_mq_tag_resize_shared_tags(set, nr);
} else {
queue_for_each_hw_ctx(q, hctx, i) {
if (!hctx->tags)
continue;
/*
* If we're using an MQ scheduler, just update the
* scheduler queue depth. This is similar to what the
* old code would do.
*/
if (hctx->sched_tags)
ret = blk_mq_tag_update_depth(hctx,
&hctx->sched_tags, nr);
else
ret = blk_mq_tag_update_depth(hctx,
&hctx->tags, nr);
if (ret)
goto out;
}
} }
q->nr_requests = nr;
if (q->elevator && q->elevator->type->ops.depth_updated)
q->elevator->type->ops.depth_updated(q);
out: out:
blk_mq_unquiesce_queue(q); blk_mq_unquiesce_queue(q);