Skip to content

Commit 1837d92

Browse files
shroffnigregkh
authored andcommitted
block: move elevator queue allocation logic into blk_mq_init_sched
[ Upstream commit 4981158 ] In preparation for allocating sched_tags before freezing the request queue and acquiring ->elevator_lock, move the elevator queue allocation logic from the elevator ops ->init_sched callback into blk_mq_init_sched. As elevator_alloc is now only invoked from block layer core, we don't need to export it, so unexport elevator_alloc function. This refactoring provides a centralized location for elevator queue initialization, which makes it easier to store pre-allocated sched_tags in the struct elevator_queue during later changes. Reviewed-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Nilay Shroff <nilay@linux.ibm.com> Link: https://lore.kernel.org/r/20250730074614.2537382-2-nilay@linux.ibm.com Signed-off-by: Jens Axboe <axboe@kernel.dk> Stable-dep-of: 2d82f3b ("blk-mq: fix lockdep warning in __blk_mq_update_nr_hw_queues") Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 4bd3ed1 commit 1837d92

File tree

6 files changed

+16
-36
lines changed

6 files changed

+16
-36
lines changed

block/bfq-iosched.c

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7229,22 +7229,16 @@ static void bfq_init_root_group(struct bfq_group *root_group,
72297229
root_group->sched_data.bfq_class_idle_last_service = jiffies;
72307230
}
72317231

7232-
static int bfq_init_queue(struct request_queue *q, struct elevator_type *e)
7232+
static int bfq_init_queue(struct request_queue *q, struct elevator_queue *eq)
72337233
{
72347234
struct bfq_data *bfqd;
7235-
struct elevator_queue *eq;
72367235
unsigned int i;
72377236
struct blk_independent_access_ranges *ia_ranges = q->disk->ia_ranges;
72387237

7239-
eq = elevator_alloc(q, e);
7240-
if (!eq)
7241-
return -ENOMEM;
7242-
72437238
bfqd = kzalloc_node(sizeof(*bfqd), GFP_KERNEL, q->node);
7244-
if (!bfqd) {
7245-
kobject_put(&eq->kobj);
7239+
if (!bfqd)
72467240
return -ENOMEM;
7247-
}
7241+
72487242
eq->elevator_data = bfqd;
72497243

72507244
spin_lock_irq(&q->queue_lock);
@@ -7402,7 +7396,6 @@ static int bfq_init_queue(struct request_queue *q, struct elevator_type *e)
74027396

74037397
out_free:
74047398
kfree(bfqd);
7405-
kobject_put(&eq->kobj);
74067399
return -ENOMEM;
74077400
}
74087401

block/blk-mq-sched.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -475,10 +475,14 @@ int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e)
475475
q->nr_requests = 2 * min_t(unsigned int, q->tag_set->queue_depth,
476476
BLKDEV_DEFAULT_RQ);
477477

478+
eq = elevator_alloc(q, e);
479+
if (!eq)
480+
return -ENOMEM;
481+
478482
if (blk_mq_is_shared_tags(flags)) {
479483
ret = blk_mq_init_sched_shared_tags(q);
480484
if (ret)
481-
return ret;
485+
goto err_put_elevator;
482486
}
483487

484488
queue_for_each_hw_ctx(q, hctx, i) {
@@ -487,7 +491,7 @@ int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e)
487491
goto err_free_map_and_rqs;
488492
}
489493

490-
ret = e->ops.init_sched(q, e);
494+
ret = e->ops.init_sched(q, eq);
491495
if (ret)
492496
goto err_free_map_and_rqs;
493497

@@ -508,7 +512,8 @@ int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e)
508512
err_free_map_and_rqs:
509513
blk_mq_sched_free_rqs(q);
510514
blk_mq_sched_tags_teardown(q, flags);
511-
515+
err_put_elevator:
516+
kobject_put(&eq->kobj);
512517
q->elevator = NULL;
513518
return ret;
514519
}

block/elevator.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ struct elevator_queue *elevator_alloc(struct request_queue *q,
148148

149149
return eq;
150150
}
151-
EXPORT_SYMBOL(elevator_alloc);
152151

153152
static void elevator_release(struct kobject *kobj)
154153
{

block/elevator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ struct blk_mq_alloc_data;
2424
struct blk_mq_hw_ctx;
2525

2626
struct elevator_mq_ops {
27-
int (*init_sched)(struct request_queue *, struct elevator_type *);
27+
int (*init_sched)(struct request_queue *, struct elevator_queue *);
2828
void (*exit_sched)(struct elevator_queue *);
2929
int (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int);
3030
void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int);

block/kyber-iosched.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -399,20 +399,13 @@ static struct kyber_queue_data *kyber_queue_data_alloc(struct request_queue *q)
399399
return ERR_PTR(ret);
400400
}
401401

402-
static int kyber_init_sched(struct request_queue *q, struct elevator_type *e)
402+
static int kyber_init_sched(struct request_queue *q, struct elevator_queue *eq)
403403
{
404404
struct kyber_queue_data *kqd;
405-
struct elevator_queue *eq;
406-
407-
eq = elevator_alloc(q, e);
408-
if (!eq)
409-
return -ENOMEM;
410405

411406
kqd = kyber_queue_data_alloc(q);
412-
if (IS_ERR(kqd)) {
413-
kobject_put(&eq->kobj);
407+
if (IS_ERR(kqd))
414408
return PTR_ERR(kqd);
415-
}
416409

417410
blk_stat_enable_accounting(q);
418411

block/mq-deadline.c

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -554,20 +554,14 @@ static void dd_exit_sched(struct elevator_queue *e)
554554
/*
555555
* initialize elevator private data (deadline_data).
556556
*/
557-
static int dd_init_sched(struct request_queue *q, struct elevator_type *e)
557+
static int dd_init_sched(struct request_queue *q, struct elevator_queue *eq)
558558
{
559559
struct deadline_data *dd;
560-
struct elevator_queue *eq;
561560
enum dd_prio prio;
562-
int ret = -ENOMEM;
563-
564-
eq = elevator_alloc(q, e);
565-
if (!eq)
566-
return ret;
567561

568562
dd = kzalloc_node(sizeof(*dd), GFP_KERNEL, q->node);
569563
if (!dd)
570-
goto put_eq;
564+
return -ENOMEM;
571565

572566
eq->elevator_data = dd;
573567

@@ -594,10 +588,6 @@ static int dd_init_sched(struct request_queue *q, struct elevator_type *e)
594588

595589
q->elevator = eq;
596590
return 0;
597-
598-
put_eq:
599-
kobject_put(&eq->kobj);
600-
return ret;
601591
}
602592

603593
/*

0 commit comments

Comments
 (0)