diff options
-rw-r--r-- | block/blk-wbt.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/block/blk-wbt.c b/block/blk-wbt.c index 463e4eb80287..f0c56649775f 100644 --- a/block/blk-wbt.c +++ b/block/blk-wbt.c | |||
@@ -715,6 +715,94 @@ void wbt_disable_default(struct request_queue *q) | |||
715 | } | 715 | } |
716 | EXPORT_SYMBOL_GPL(wbt_disable_default); | 716 | EXPORT_SYMBOL_GPL(wbt_disable_default); |
717 | 717 | ||
718 | #ifdef CONFIG_BLK_DEBUG_FS | ||
719 | static int wbt_curr_win_nsec_show(void *data, struct seq_file *m) | ||
720 | { | ||
721 | struct rq_qos *rqos = data; | ||
722 | struct rq_wb *rwb = RQWB(rqos); | ||
723 | |||
724 | seq_printf(m, "%llu\n", rwb->cur_win_nsec); | ||
725 | return 0; | ||
726 | } | ||
727 | |||
728 | static int wbt_enabled_show(void *data, struct seq_file *m) | ||
729 | { | ||
730 | struct rq_qos *rqos = data; | ||
731 | struct rq_wb *rwb = RQWB(rqos); | ||
732 | |||
733 | seq_printf(m, "%d\n", rwb->enable_state); | ||
734 | return 0; | ||
735 | } | ||
736 | |||
737 | static int wbt_id_show(void *data, struct seq_file *m) | ||
738 | { | ||
739 | struct rq_qos *rqos = data; | ||
740 | |||
741 | seq_printf(m, "%u\n", rqos->id); | ||
742 | return 0; | ||
743 | } | ||
744 | |||
745 | static int wbt_inflight_show(void *data, struct seq_file *m) | ||
746 | { | ||
747 | struct rq_qos *rqos = data; | ||
748 | struct rq_wb *rwb = RQWB(rqos); | ||
749 | int i; | ||
750 | |||
751 | for (i = 0; i < WBT_NUM_RWQ; i++) | ||
752 | seq_printf(m, "%d: inflight %d\n", i, | ||
753 | atomic_read(&rwb->rq_wait[i].inflight)); | ||
754 | return 0; | ||
755 | } | ||
756 | |||
757 | static int wbt_min_lat_nsec_show(void *data, struct seq_file *m) | ||
758 | { | ||
759 | struct rq_qos *rqos = data; | ||
760 | struct rq_wb *rwb = RQWB(rqos); | ||
761 | |||
762 | seq_printf(m, "%lu\n", rwb->min_lat_nsec); | ||
763 | return 0; | ||
764 | } | ||
765 | |||
766 | static int wbt_unknown_cnt_show(void *data, struct seq_file *m) | ||
767 | { | ||
768 | struct rq_qos *rqos = data; | ||
769 | struct rq_wb *rwb = RQWB(rqos); | ||
770 | |||
771 | seq_printf(m, "%u\n", rwb->unknown_cnt); | ||
772 | return 0; | ||
773 | } | ||
774 | |||
775 | static int wbt_normal_show(void *data, struct seq_file *m) | ||
776 | { | ||
777 | struct rq_qos *rqos = data; | ||
778 | struct rq_wb *rwb = RQWB(rqos); | ||
779 | |||
780 | seq_printf(m, "%u\n", rwb->wb_normal); | ||
781 | return 0; | ||
782 | } | ||
783 | |||
784 | static int wbt_background_show(void *data, struct seq_file *m) | ||
785 | { | ||
786 | struct rq_qos *rqos = data; | ||
787 | struct rq_wb *rwb = RQWB(rqos); | ||
788 | |||
789 | seq_printf(m, "%u\n", rwb->wb_background); | ||
790 | return 0; | ||
791 | } | ||
792 | |||
793 | static const struct blk_mq_debugfs_attr wbt_debugfs_attrs[] = { | ||
794 | {"curr_win_nsec", 0400, wbt_curr_win_nsec_show}, | ||
795 | {"enabled", 0400, wbt_enabled_show}, | ||
796 | {"id", 0400, wbt_id_show}, | ||
797 | {"inflight", 0400, wbt_inflight_show}, | ||
798 | {"min_lat_nsec", 0400, wbt_min_lat_nsec_show}, | ||
799 | {"unknown_cnt", 0400, wbt_unknown_cnt_show}, | ||
800 | {"wb_normal", 0400, wbt_normal_show}, | ||
801 | {"wb_background", 0400, wbt_background_show}, | ||
802 | {}, | ||
803 | }; | ||
804 | #endif | ||
805 | |||
718 | static struct rq_qos_ops wbt_rqos_ops = { | 806 | static struct rq_qos_ops wbt_rqos_ops = { |
719 | .throttle = wbt_wait, | 807 | .throttle = wbt_wait, |
720 | .issue = wbt_issue, | 808 | .issue = wbt_issue, |
@@ -723,6 +811,9 @@ static struct rq_qos_ops wbt_rqos_ops = { | |||
723 | .done = wbt_done, | 811 | .done = wbt_done, |
724 | .cleanup = wbt_cleanup, | 812 | .cleanup = wbt_cleanup, |
725 | .exit = wbt_exit, | 813 | .exit = wbt_exit, |
814 | #ifdef CONFIG_BLK_DEBUG_FS | ||
815 | .debugfs_attrs = wbt_debugfs_attrs, | ||
816 | #endif | ||
726 | }; | 817 | }; |
727 | 818 | ||
728 | int wbt_init(struct request_queue *q) | 819 | int wbt_init(struct request_queue *q) |