Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

blk-mq-debugfs: factor out a helper to register debugfs for all rq_qos

There is already a helper blk_mq_debugfs_register_rqos() to register
one rqos, however this helper is called synchronously when the rqos is
created with queue frozen.

Prepare to fix possible deadlock to create blk-mq debugfs entries while
queue is still frozen.

Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Signed-off-by: Yu Kuai <yukuai@fnnas.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Yu Kuai and committed by
Jens Axboe
3f0bea9f 41afaeed

+20 -8
+15 -8
block/blk-mq-debugfs.c
··· 631 631 blk_mq_debugfs_register_hctx(q, hctx); 632 632 } 633 633 634 - if (q->rq_qos) { 635 - struct rq_qos *rqos = q->rq_qos; 636 - 637 - while (rqos) { 638 - blk_mq_debugfs_register_rqos(rqos); 639 - rqos = rqos->next; 640 - } 641 - } 634 + blk_mq_debugfs_register_rq_qos(q); 642 635 } 643 636 644 637 static void blk_mq_debugfs_register_ctx(struct blk_mq_hw_ctx *hctx, ··· 760 767 761 768 rqos->debugfs_dir = debugfs_create_dir(dir_name, q->rqos_debugfs_dir); 762 769 debugfs_create_files(rqos->debugfs_dir, rqos, rqos->ops->debugfs_attrs); 770 + } 771 + 772 + void blk_mq_debugfs_register_rq_qos(struct request_queue *q) 773 + { 774 + lockdep_assert_held(&q->debugfs_mutex); 775 + 776 + if (q->rq_qos) { 777 + struct rq_qos *rqos = q->rq_qos; 778 + 779 + while (rqos) { 780 + blk_mq_debugfs_register_rqos(rqos); 781 + rqos = rqos->next; 782 + } 783 + } 763 784 } 764 785 765 786 void blk_mq_debugfs_register_sched_hctx(struct request_queue *q,
+5
block/blk-mq-debugfs.h
··· 33 33 struct blk_mq_hw_ctx *hctx); 34 34 void blk_mq_debugfs_unregister_sched_hctx(struct blk_mq_hw_ctx *hctx); 35 35 36 + void blk_mq_debugfs_register_rq_qos(struct request_queue *q); 36 37 void blk_mq_debugfs_register_rqos(struct rq_qos *rqos); 37 38 void blk_mq_debugfs_unregister_rqos(struct rq_qos *rqos); 38 39 #else ··· 76 75 } 77 76 78 77 static inline void blk_mq_debugfs_register_rqos(struct rq_qos *rqos) 78 + { 79 + } 80 + 81 + static inline void blk_mq_debugfs_register_rq_qos(struct request_queue *q) 79 82 { 80 83 } 81 84