@@ -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.
@@ -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)
@@ -686,6 +687,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,
@@ -777,6 +784,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
@@ -610,6 +610,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))
@@ -652,6 +653,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);
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@cloud.ionos.com> --- Documentation/block/queue-sysfs.rst | 6 ++++++ block/blk-sysfs.c | 8 ++++++++ include/linux/blkdev.h | 2 ++ 3 files changed, 16 insertions(+)