]> www.infradead.org Git - users/hch/misc.git/commitdiff
block: introduce a write_stream_granularity queue limit
authorChristoph Hellwig <hch@lst.de>
Mon, 11 Nov 2024 08:34:34 +0000 (09:34 +0100)
committerChristoph Hellwig <hch@lst.de>
Tue, 19 Nov 2024 10:34:51 +0000 (11:34 +0100)
Export the granularity that write streams should be discarded with,
as it is essential for making good use of them.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Documentation/ABI/stable/sysfs-block
block/blk-sysfs.c
include/linux/blkdev.h

index ae86447264227eb1b443d53d6a17071e6bf4fc0e..9f2a3005c41c7971d3ee3ab78e43e07009415860 100644 (file)
@@ -514,6 +514,14 @@ Description:
                supported. If supported, valid values are 1 through
                max_write_streams, inclusive.
 
+What:          /sys/block/<disk>/queue/write_stream_granularity
+Date:          November 2024
+Contact:       linux-block@vger.kernel.org
+Description:
+               [RO] Granularity of a write stream in bytes.  The granularity
+               of a write stream is the size that should be discarded or
+               overwritten together to avoid write amplification in the device.
+
 What:          /sys/block/<disk>/queue/max_segments
 Date:          March 2010
 Contact:       linux-block@vger.kernel.org
index c514c0cb5e93c11e6bad9b7c345dfa655a261555..525f4fa132cd3f6f161143f158f663ba3de02d03 100644 (file)
@@ -105,6 +105,7 @@ QUEUE_SYSFS_LIMIT_SHOW(max_discard_segments)
 QUEUE_SYSFS_LIMIT_SHOW(max_integrity_segments)
 QUEUE_SYSFS_LIMIT_SHOW(max_segment_size)
 QUEUE_SYSFS_LIMIT_SHOW(max_write_streams)
+QUEUE_SYSFS_LIMIT_SHOW(write_stream_granularity)
 QUEUE_SYSFS_LIMIT_SHOW(logical_block_size)
 QUEUE_SYSFS_LIMIT_SHOW(physical_block_size)
 QUEUE_SYSFS_LIMIT_SHOW(chunk_sectors)
@@ -448,6 +449,7 @@ QUEUE_RO_ENTRY(queue_max_segments, "max_segments");
 QUEUE_RO_ENTRY(queue_max_integrity_segments, "max_integrity_segments");
 QUEUE_RO_ENTRY(queue_max_segment_size, "max_segment_size");
 QUEUE_RO_ENTRY(queue_max_write_streams, "max_write_streams");
+QUEUE_RO_ENTRY(queue_write_stream_granularity, "write_stream_granularity");
 QUEUE_RW_LOAD_MODULE_ENTRY(elv_iosched, "scheduler");
 
 QUEUE_RO_ENTRY(queue_logical_block_size, "logical_block_size");
@@ -583,6 +585,7 @@ static struct attribute *queue_attrs[] = {
        &queue_max_integrity_segments_entry.attr,
        &queue_max_segment_size_entry.attr,
        &queue_max_write_streams_entry.attr,
+       &queue_write_stream_granularity_entry.attr,
        &queue_hw_sector_size_entry.attr,
        &queue_logical_block_size_entry.attr,
        &queue_physical_block_size_entry.attr,
index 202e1becd41095601d3ad1ef97636bb064d4c145..9fda66530d9a5232b6e3b46ecb98747c46af0ff0 100644 (file)
@@ -396,6 +396,7 @@ struct queue_limits {
        unsigned short          max_discard_segments;
 
        unsigned short          max_write_streams;
+       unsigned int            write_stream_granularity;
 
        unsigned int            max_open_zones;
        unsigned int            max_active_zones;
@@ -1245,6 +1246,12 @@ static inline unsigned short bdev_max_write_streams(struct block_device *bdev)
        return bdev_limits(bdev)->max_write_streams;
 }
 
+static inline unsigned int
+bdev_write_stream_granularity(struct block_device *bdev)
+{
+       return bdev_limits(bdev)->write_stream_granularity;
+}
+
 static inline unsigned queue_logical_block_size(const struct request_queue *q)
 {
        return q->limits.logical_block_size;