]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: default to QD=1 writes for blk-mq rotational zoned devices
authorDamien Le Moal <dlemoal@kernel.org>
Fri, 27 Feb 2026 13:19:50 +0000 (22:19 +0900)
committerJens Axboe <axboe@kernel.dk>
Mon, 9 Mar 2026 20:30:00 +0000 (14:30 -0600)
For blk-mq rotational zoned block devices (e.g. SMR HDDs), default to
having zone write plugging limit write operations to a maximum queue
depth of 1 for all zones. This significantly reduce write seek overhead
and improves SMR HDD write throughput.

For remotely connected disks with a very high network latency this
features might not be useful. However, remotely connected zoned devices
are rare at the moment, and we cannot know the round trip latency to
pick a good default for network attached devices. System administrators
can however disable this feature in that case.

For BIO based (non blk-mq) rotational zoned block devices, the device
driver (e.g. a DM target driver) can directly set an appropriate
default.

Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-sysfs.c

index ca8033e6d6990c7e557d09781015ac72c886b819..878b8a4b55bb671bea68d65d1616818164b6d43e 100644 (file)
@@ -967,6 +967,14 @@ int blk_register_queue(struct gendisk *disk)
                blk_mq_debugfs_register(q);
        blk_debugfs_unlock(q, memflags);
 
+       /*
+        * For blk-mq rotational zoned devices, default to using QD=1
+        * writes. For non-mq rotational zoned devices, the device driver can
+        * set an appropriate default.
+        */
+       if (queue_is_mq(q) && blk_queue_rot(q) && blk_queue_is_zoned(q))
+               blk_queue_flag_set(QUEUE_FLAG_ZONED_QD1_WRITES, q);
+
        ret = disk_register_independent_access_ranges(disk);
        if (ret)
                goto out_debugfs_remove;