From d1e8cd1f0358e41489181b5d33b41cbb49fcb0b2 Mon Sep 17 00:00:00 2001 From: Sandeep Dhavale Date: Wed, 22 Jan 2025 12:18:28 -0800 Subject: [PATCH] ANDROID: block: Make sub_page_limit_queues available in debugfs This new debugfs attribute makes it easier to verify the code that tracks how many queues require limits below the page size. Reviewed-by: Luis Chamberlain Cc: Christoph Hellwig Cc: Ming Lei Cc: Keith Busch Signed-off-by: Bart Van Assche Signed-off-by: Sandeep Dhavale Bug: 346870006 Link: https://lore.kernel.org/all/20230612203314.17820-5-bvanassche@acm.org/ [dhavale: this patch is from the series is rejected upstream but we would like this to be in android kernel in order to support 16KB page size on storage devices with max segment size 4KB] Change-Id: Ifae8e08cff597c42f5a5630fac160982af5dc699 --- block/blk-core.c | 2 ++ block/blk-mq-debugfs.c | 8 ++++++++ block/blk-mq-debugfs.h | 5 +++++ block/blk-settings.c | 8 ++++++++ block/blk.h | 2 +- 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/block/blk-core.c b/block/blk-core.c index 26d1ab95b91e..a33e47731806 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -45,6 +45,7 @@ #include #include "blk.h" +#include "blk-mq-debugfs.h" #include "blk-mq-sched.h" #include "blk-pm.h" #include "blk-cgroup.h" @@ -1279,6 +1280,7 @@ int __init blk_dev_init(void) blk_requestq_cachep = KMEM_CACHE(request_queue, SLAB_PANIC); blk_debugfs_root = debugfs_create_dir("block", NULL); + blk_mq_debugfs_init(); return 0; } diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c index 5463697a8442..1c5ade59c081 100644 --- a/block/blk-mq-debugfs.c +++ b/block/blk-mq-debugfs.c @@ -829,3 +829,11 @@ void blk_mq_debugfs_unregister_sched_hctx(struct blk_mq_hw_ctx *hctx) debugfs_remove_recursive(hctx->sched_debugfs_dir); hctx->sched_debugfs_dir = NULL; } +DEFINE_DEBUGFS_ATTRIBUTE(blk_sub_page_limit_queues_fops, + blk_sub_page_limit_queues_get, NULL, "%llu\n"); + +void blk_mq_debugfs_init(void) +{ + debugfs_create_file("sub_page_limit_queues", 0400, blk_debugfs_root, + NULL, &blk_sub_page_limit_queues_fops); +} diff --git a/block/blk-mq-debugfs.h b/block/blk-mq-debugfs.h index c80e453e3014..0d1d18177946 100644 --- a/block/blk-mq-debugfs.h +++ b/block/blk-mq-debugfs.h @@ -17,6 +17,7 @@ struct blk_mq_debugfs_attr { const struct seq_operations *seq_ops; }; +void blk_mq_debugfs_init(void); int __blk_mq_debugfs_rq_show(struct seq_file *m, struct request *rq); int blk_mq_debugfs_rq_show(struct seq_file *m, void *v); @@ -36,6 +37,10 @@ void blk_mq_debugfs_unregister_sched_hctx(struct blk_mq_hw_ctx *hctx); void blk_mq_debugfs_register_rqos(struct rq_qos *rqos); void blk_mq_debugfs_unregister_rqos(struct rq_qos *rqos); #else +static inline void blk_mq_debugfs_init(void) +{ +} + static inline void blk_mq_debugfs_register(struct request_queue *q) { } diff --git a/block/blk-settings.c b/block/blk-settings.c index 2d6555f05cc8..4e4c3b52b67a 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -225,6 +225,14 @@ unsupported: lim->atomic_write_unit_max = 0; } +/* For debugfs. */ +int blk_sub_page_limit_queues_get(void *data, u64 *val) +{ + *val = READ_ONCE(blk_nr_sub_page_limit_queues); + + return 0; +} + /** * blk_enable_sub_page_limits - enable support for limits below the page size * @lim: request queue limits for which to enable support of these features. diff --git a/block/blk.h b/block/blk.h index 5fa343b8cb12..183446bc7d77 100644 --- a/block/blk.h +++ b/block/blk.h @@ -44,12 +44,12 @@ bool __blk_freeze_queue_start(struct request_queue *q, int __bio_queue_enter(struct request_queue *q, struct bio *bio); void submit_bio_noacct_nocheck(struct bio *bio); void bio_await_chain(struct bio *bio); - static inline bool blk_queue_sub_page_limits(const struct queue_limits *lim) { return static_branch_unlikely(&blk_sub_page_limits) && lim->sub_page_limits; } +int blk_sub_page_limit_queues_get(void *data, u64 *val); void blk_disable_sub_page_limits(struct queue_limits *q); static inline bool blk_try_enter_queue(struct request_queue *q, bool pm) {