Skip to content

Commit 4a6f62a

Browse files
author
Ming Lei
committed
block: don't acquire ->elevator_lock in blk_mq_map_swqueue and blk_mq_realloc_hw_ctxs
JIRA: https://issues.redhat.com/browse/RHEL-112997 commit 0a47d2b Author: Ming Lei <[email protected]> Date: Mon May 5 22:18:01 2025 +0800 block: don't acquire ->elevator_lock in blk_mq_map_swqueue and blk_mq_realloc_hw_ctxs Both blk_mq_map_swqueue() and blk_mq_realloc_hw_ctxs() are called before the request queue is added to tagset list, so the two won't run concurrently with blk_mq_update_nr_hw_queues(). When the two functions are only called from queue initialization or blk_mq_update_nr_hw_queues(), elevator switch can't happen. So remove ->elevator_lock uses from the two functions. Reviewed-by: Hannes Reinecke <[email protected]> Reviewed-by: Nilay Shroff <[email protected]> Signed-off-by: Ming Lei <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]> Signed-off-by: Ming Lei <[email protected]>
1 parent 27a781e commit 4a6f62a

File tree

1 file changed

+4
-15
lines changed

1 file changed

+4
-15
lines changed

block/blk-mq.c

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4158,8 +4158,6 @@ static void blk_mq_map_swqueue(struct request_queue *q)
41584158
struct blk_mq_ctx *ctx;
41594159
struct blk_mq_tag_set *set = q->tag_set;
41604160

4161-
mutex_lock(&q->elevator_lock);
4162-
41634161
queue_for_each_hw_ctx(q, hctx, i) {
41644162
cpumask_clear(hctx->cpumask);
41654163
hctx->nr_ctx = 0;
@@ -4264,8 +4262,6 @@ static void blk_mq_map_swqueue(struct request_queue *q)
42644262
hctx->next_cpu = blk_mq_first_mapped_cpu(hctx);
42654263
hctx->next_cpu_batch = BLK_MQ_CPU_WORK_BATCH;
42664264
}
4267-
4268-
mutex_unlock(&q->elevator_lock);
42694265
}
42704266

42714267
/*
@@ -4569,16 +4565,9 @@ static void __blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
45694565
}
45704566

45714567
static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
4572-
struct request_queue *q, bool lock)
4568+
struct request_queue *q)
45734569
{
4574-
if (lock) {
4575-
/* protect against switching io scheduler */
4576-
mutex_lock(&q->elevator_lock);
4577-
__blk_mq_realloc_hw_ctxs(set, q);
4578-
mutex_unlock(&q->elevator_lock);
4579-
} else {
4580-
__blk_mq_realloc_hw_ctxs(set, q);
4581-
}
4570+
__blk_mq_realloc_hw_ctxs(set, q);
45824571

45834572
/* unregister cpuhp callbacks for exited hctxs */
45844573
blk_mq_remove_hw_queues_cpuhp(q);
@@ -4610,7 +4599,7 @@ int blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
46104599

46114600
xa_init(&q->hctx_table);
46124601

4613-
blk_mq_realloc_hw_ctxs(set, q, false);
4602+
blk_mq_realloc_hw_ctxs(set, q);
46144603
if (!q->nr_hw_queues)
46154604
goto err_hctxs;
46164605

@@ -5021,7 +5010,7 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set,
50215010
fallback:
50225011
blk_mq_update_queue_map(set);
50235012
list_for_each_entry(q, &set->tag_list, tag_set_list) {
5024-
blk_mq_realloc_hw_ctxs(set, q, true);
5013+
blk_mq_realloc_hw_ctxs(set, q);
50255014

50265015
if (q->nr_hw_queues != set->nr_hw_queues) {
50275016
int i = prev_nr_hw_queues;

0 commit comments

Comments
 (0)