summaryrefslogtreecommitdiffstats
path: root/block/blk-mq-sched.c
diff options
context:
space:
mode:
authorOmar Sandoval <osandov@fb.com>2017-04-05 15:01:31 -0400
committerJens Axboe <axboe@fb.com>2017-04-07 10:56:46 -0400
commit93252632e828da3e90241a1c0e766556abf71598 (patch)
tree388756bb6862ea8943c87240644a33feb8c5c402 /block/blk-mq-sched.c
parent6917ff0b5bd4139e08a3f3146529dcb3b95ba7a6 (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.c22
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
464int 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
475void 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
464int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e) 486int 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;