From: Guoqing Jiang <guoqing.jiang@xxxxxxxxxxxxxxx> Even we have introduced a Kconfig option (default N) to control the accounting of additional data, but the option still could be enabled occasionally while user doesn't care about the size and latency of io, and they could suffer from the additional overhead. So introduce a specific sysfs node to avoid such mistake. Signed-off-by: Guoqing Jiang <guoqing.jiang@xxxxxxxxxxxxxxx> --- Documentation/ABI/testing/sysfs-block | 9 +++++++++ Documentation/block/queue-sysfs.rst | 6 ++++++ block/blk-sysfs.c | 8 ++++++++ include/linux/blkdev.h | 2 ++ 4 files changed, 25 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block index d00d940e4e1b..0f8fe43518e5 100644 --- a/Documentation/ABI/testing/sysfs-block +++ b/Documentation/ABI/testing/sysfs-block @@ -329,3 +329,12 @@ Description: does not complete in this time then the block driver timeout handler is invoked. That timeout handler can decide to retry the request, to fail it or to start a device recovery strategy. + +What: /sys/block/<disk>/queue/io_extra_stats +Date: August 2020 +Contact: Guoqing Jiang <guoqing.jiang@xxxxxxxxxxxxxxx> +Description: + Indicates if people want to know the extra statistics (I/O + size and I/O latency) from /sys/block/<disk>/io_latency + and /sys/block/<disk>/io_size. The value is 0 by default, + set if the extra statistics are needed. diff --git a/Documentation/block/queue-sysfs.rst b/Documentation/block/queue-sysfs.rst index f261a5c84170..d1055aac4c83 100644 --- a/Documentation/block/queue-sysfs.rst +++ b/Documentation/block/queue-sysfs.rst @@ -99,6 +99,12 @@ iostats (RW) This file is used to control (on/off) the iostats accounting of the disk. +io_extra_stats (RW) +------------------- +This file is used to control (on/off) the additional accounting of the +io size and io latency of disk, and BLK_ADDITIONAL_DISKSTAT should be +enabled if you want the additional accounting. + logical_block_size (RO) ----------------------- This is the logical block size of the device, in bytes. diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 7dda709f3ccb..93692f59d26c 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -287,6 +287,7 @@ queue_store_##name(struct request_queue *q, const char *page, size_t count) \ QUEUE_SYSFS_BIT_FNS(nonrot, NONROT, 1); QUEUE_SYSFS_BIT_FNS(random, ADD_RANDOM, 0); QUEUE_SYSFS_BIT_FNS(iostats, IO_STAT, 0); +QUEUE_SYSFS_BIT_FNS(io_extra_stats, IO_EXTRA_STAT, 0); #undef QUEUE_SYSFS_BIT_FNS static ssize_t queue_zoned_show(struct request_queue *q, char *page) @@ -706,6 +707,12 @@ static struct queue_sysfs_entry queue_iostats_entry = { .store = queue_store_iostats, }; +static struct queue_sysfs_entry queue_io_extra_stats_entry = { + .attr = {.name = "io_extra_stats", .mode = 0644 }, + .show = queue_show_io_extra_stats, + .store = queue_store_io_extra_stats, +}; + static struct queue_sysfs_entry queue_random_entry = { .attr = {.name = "add_random", .mode = 0644 }, .show = queue_show_random, @@ -799,6 +806,7 @@ static struct attribute *queue_attrs[] = { &queue_wb_lat_entry.attr, &queue_poll_delay_entry.attr, &queue_io_timeout_entry.attr, + &queue_io_extra_stats_entry.attr, #ifdef CONFIG_BLK_DEV_THROTTLING_LOW &throtl_sample_time_entry.attr, #endif diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index bb5636cc17b9..b014ab035656 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -615,6 +615,7 @@ struct request_queue { #define QUEUE_FLAG_PCI_P2PDMA 25 /* device supports PCI p2p requests */ #define QUEUE_FLAG_ZONE_RESETALL 26 /* supports Zone Reset All */ #define QUEUE_FLAG_RQ_ALLOC_TIME 27 /* record rq->alloc_time_ns */ +#define QUEUE_FLAG_IO_EXTRA_STAT 28 /* extra IO accounting for latency and size */ #define QUEUE_FLAG_MQ_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \ (1 << QUEUE_FLAG_SAME_COMP)) @@ -657,6 +658,7 @@ bool blk_queue_flag_test_and_set(unsigned int flag, struct request_queue *q); #define blk_queue_pm_only(q) atomic_read(&(q)->pm_only) #define blk_queue_fua(q) test_bit(QUEUE_FLAG_FUA, &(q)->queue_flags) #define blk_queue_registered(q) test_bit(QUEUE_FLAG_REGISTERED, &(q)->queue_flags) +#define blk_queue_extra_io_stat(q) test_bit(QUEUE_FLAG_IO_EXTRA_STAT, &(q)->queue_flags) extern void blk_set_pm_only(struct request_queue *q); extern void blk_clear_pm_only(struct request_queue *q); -- 2.17.1