mirror of https://github.com/torvalds/linux.git
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:
parent
626ff4f8eb
commit
7f2799c546
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -4935,33 +4935,34 @@ 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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue