diff options
author | Omar Sandoval <osandov@fb.com> | 2017-04-05 15:01:31 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2017-04-07 10:56:46 -0400 |
commit | 93252632e828da3e90241a1c0e766556abf71598 (patch) | |
tree | 388756bb6862ea8943c87240644a33feb8c5c402 /block/blk-mq-sched.c | |
parent | 6917ff0b5bd4139e08a3f3146529dcb3b95ba7a6 (diff) |
blk-mq-sched: set up scheduler tags when bringing up new queues
If a new hardware queue is added at runtime, we don't allocate scheduler
tags for it, leading to a crash. This hooks up the scheduler framework
to blk_mq_{init,exit}_hctx() to make sure everything gets properly
initialized/freed.
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/blk-mq-sched.c')
-rw-r--r-- | block/blk-mq-sched.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c index 6bd1758ea29b..0bb13bb51daa 100644 --- a/block/blk-mq-sched.c +++ b/block/blk-mq-sched.c | |||
@@ -461,6 +461,28 @@ void blk_mq_sched_teardown(struct request_queue *q) | |||
461 | blk_mq_sched_free_tags(set, hctx, i); | 461 | blk_mq_sched_free_tags(set, hctx, i); |
462 | } | 462 | } |
463 | 463 | ||
464 | int blk_mq_sched_init_hctx(struct request_queue *q, struct blk_mq_hw_ctx *hctx, | ||
465 | unsigned int hctx_idx) | ||
466 | { | ||
467 | struct elevator_queue *e = q->elevator; | ||
468 | |||
469 | if (!e) | ||
470 | return 0; | ||
471 | |||
472 | return blk_mq_sched_alloc_tags(q, hctx, hctx_idx); | ||
473 | } | ||
474 | |||
475 | void blk_mq_sched_exit_hctx(struct request_queue *q, struct blk_mq_hw_ctx *hctx, | ||
476 | unsigned int hctx_idx) | ||
477 | { | ||
478 | struct elevator_queue *e = q->elevator; | ||
479 | |||
480 | if (!e) | ||
481 | return; | ||
482 | |||
483 | blk_mq_sched_free_tags(q->tag_set, hctx, hctx_idx); | ||
484 | } | ||
485 | |||
464 | int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e) | 486 | int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e) |
465 | { | 487 | { |
466 | struct blk_mq_hw_ctx *hctx; | 488 | struct blk_mq_hw_ctx *hctx; |