]> www.infradead.org Git - users/hch/misc.git/commitdiff
block: introduce max_write_streams queue limit
authorKeith Busch <kbusch@kernel.org>
Fri, 8 Nov 2024 19:36:22 +0000 (11:36 -0800)
committerChristoph Hellwig <hch@lst.de>
Tue, 19 Nov 2024 10:34:51 +0000 (11:34 +0100)
Drivers with hardware that support write streams need a way to export how
many are available so applications can generically query this.

Note: compared to Keith's origina version this does not automatically
stack the limit.  There is no good way to generically stack them.  For
mirroring or striping just mirroring the write streams will work, but
for everything more complex the stacking drive actually needs to manage
them.

Signed-off-by: Keith Busch <kbusch@kernel.org>
[hch: renamed from max_write_hints to max_write_streams]
Signed-off-by: Christoph Hellwig <hch@lst.de>
Documentation/ABI/stable/sysfs-block
block/blk-sysfs.c
include/linux/blkdev.h

index 835361110715455b1888cb095397023707e788bf..ae86447264227eb1b443d53d6a17071e6bf4fc0e 100644 (file)
@@ -506,6 +506,13 @@ Description:
                [RO] Maximum size in bytes of a single element in a DMA
                scatter/gather list.
 
+What:          /sys/block/<disk>/queue/max_write_streams
+Date:          November 2024
+Contact:       linux-block@vger.kernel.org
+Description:
+               [RO] Maximum number of write streams supported, 0 if not
+               supported. If supported, valid values are 1 through
+               max_write_streams, inclusive.
 
 What:          /sys/block/<disk>/queue/max_segments
 Date:          March 2010
index 4241aea84161ca7611bbdad70bd524ab79922898..c514c0cb5e93c11e6bad9b7c345dfa655a261555 100644 (file)
@@ -104,6 +104,7 @@ QUEUE_SYSFS_LIMIT_SHOW(max_segments)
 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(logical_block_size)
 QUEUE_SYSFS_LIMIT_SHOW(physical_block_size)
 QUEUE_SYSFS_LIMIT_SHOW(chunk_sectors)
@@ -446,6 +447,7 @@ QUEUE_RO_ENTRY(queue_max_hw_sectors, "max_hw_sectors_kb");
 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_RW_LOAD_MODULE_ENTRY(elv_iosched, "scheduler");
 
 QUEUE_RO_ENTRY(queue_logical_block_size, "logical_block_size");
@@ -580,6 +582,7 @@ static struct attribute *queue_attrs[] = {
        &queue_max_discard_segments_entry.attr,
        &queue_max_integrity_segments_entry.attr,
        &queue_max_segment_size_entry.attr,
+       &queue_max_write_streams_entry.attr,
        &queue_hw_sector_size_entry.attr,
        &queue_logical_block_size_entry.attr,
        &queue_physical_block_size_entry.attr,
index a1fd0ddce5cf7649ba8a448d6f60ed2e23239c4e..202e1becd41095601d3ad1ef97636bb064d4c145 100644 (file)
@@ -395,6 +395,8 @@ struct queue_limits {
        unsigned short          max_integrity_segments;
        unsigned short          max_discard_segments;
 
+       unsigned short          max_write_streams;
+
        unsigned int            max_open_zones;
        unsigned int            max_active_zones;
 
@@ -1236,6 +1238,13 @@ static inline unsigned int bdev_max_segments(struct block_device *bdev)
        return queue_max_segments(bdev_get_queue(bdev));
 }
 
+static inline unsigned short bdev_max_write_streams(struct block_device *bdev)
+{
+       if (bdev_is_partition(bdev))
+               return 0;
+       return bdev_limits(bdev)->max_write_streams;
+}
+
 static inline unsigned queue_logical_block_size(const struct request_queue *q)
 {
        return q->limits.logical_block_size;