Skip to content

Commit 4981158

Browse files
shroffniaxboe
authored andcommitted
block: move elevator queue allocation logic into blk_mq_init_sched
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 <[email protected]> Reviewed-by: Hannes Reinecke <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Nilay Shroff <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 5421681 commit 4981158

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
@@ -7218,22 +7218,16 @@ static void bfq_init_root_group(struct bfq_group *root_group,
72187218
root_group->sched_data.bfq_class_idle_last_service = jiffies;
72197219
}
72207220

7221-
static int bfq_init_queue(struct request_queue *q, struct elevator_type *e)
7221+
static int bfq_init_queue(struct request_queue *q, struct elevator_queue *eq)
72227222
{
72237223
struct bfq_data *bfqd;
7224-
struct elevator_queue *eq;
72257224
unsigned int i;
72267225
struct blk_independent_access_ranges *ia_ranges = q->disk->ia_ranges;
72277226

7228-
eq = elevator_alloc(q, e);
7229-
if (!eq)
7230-
return -ENOMEM;
7231-
72327227
bfqd = kzalloc_node(sizeof(*bfqd), GFP_KERNEL, q->node);
7233-
if (!bfqd) {
7234-
kobject_put(&eq->kobj);
7228+
if (!bfqd)
72357229
return -ENOMEM;
7236-
}
7230+
72377231
eq->elevator_data = bfqd;
72387232

72397233
spin_lock_irq(&q->queue_lock);
@@ -7391,7 +7385,6 @@ static int bfq_init_queue(struct request_queue *q, struct elevator_type *e)
73917385

73927386
out_free:
73937387
kfree(bfqd);
7394-
kobject_put(&eq->kobj);
73957388
return -ENOMEM;
73967389
}
73977390

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
@@ -402,20 +402,13 @@ static struct kyber_queue_data *kyber_queue_data_alloc(struct request_queue *q)
402402
return ERR_PTR(ret);
403403
}
404404

405-
static int kyber_init_sched(struct request_queue *q, struct elevator_type *e)
405+
static int kyber_init_sched(struct request_queue *q, struct elevator_queue *eq)
406406
{
407407
struct kyber_queue_data *kqd;
408-
struct elevator_queue *eq;
409-
410-
eq = elevator_alloc(q, e);
411-
if (!eq)
412-
return -ENOMEM;
413408

414409
kqd = kyber_queue_data_alloc(q);
415-
if (IS_ERR(kqd)) {
416-
kobject_put(&eq->kobj);
410+
if (IS_ERR(kqd))
417411
return PTR_ERR(kqd);
418-
}
419412

420413
blk_stat_enable_accounting(q);
421414

block/mq-deadline.c

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -568,20 +568,14 @@ static void dd_exit_sched(struct elevator_queue *e)
568568
/*
569569
* initialize elevator private data (deadline_data).
570570
*/
571-
static int dd_init_sched(struct request_queue *q, struct elevator_type *e)
571+
static int dd_init_sched(struct request_queue *q, struct elevator_queue *eq)
572572
{
573573
struct deadline_data *dd;
574-
struct elevator_queue *eq;
575574
enum dd_prio prio;
576-
int ret = -ENOMEM;
577-
578-
eq = elevator_alloc(q, e);
579-
if (!eq)
580-
return ret;
581575

582576
dd = kzalloc_node(sizeof(*dd), GFP_KERNEL, q->node);
583577
if (!dd)
584-
goto put_eq;
578+
return -ENOMEM;
585579

586580
eq->elevator_data = dd;
587581

@@ -608,10 +602,6 @@ static int dd_init_sched(struct request_queue *q, struct elevator_type *e)
608602

609603
q->elevator = eq;
610604
return 0;
611-
612-
put_eq:
613-
kobject_put(&eq->kobj);
614-
return ret;
615605
}
616606

617607
/*

0 commit comments

Comments
 (0)