]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfs: improve default maximum number of open zones
authorDamien Le Moal <dlemoal@kernel.org>
Thu, 18 Sep 2025 13:01:11 +0000 (22:01 +0900)
committerCarlos Maiolino <cem@kernel.org>
Thu, 18 Sep 2025 15:32:39 +0000 (17:32 +0200)
For regular block devices using the zoned allocator, the default
maximum number of open zones is set to 1/4 of the number of realtime
groups. For a large capacity device, this leads to a very large limit.
E.g. with a 26 TB HDD:

mount /dev/sdb /mnt
...
XFS (sdb): 95836 zones of 65536 blocks size (23959 max open)

In turn such large limit on the number of open zones can lead, depending
on the workload, on a very large number of concurrent write streams
which devices generally do not handle well, leading to poor performance.

Introduce the default limit XFS_DEFAULT_MAX_OPEN_ZONES, defined as 128
to match the hardware limit of most SMR HDDs available today, and use
this limit to set mp->m_max_open_zones in xfs_calc_open_zones() instead
of calling xfs_max_open_zones(), when the user did not specify a limit
with the max_open_zones mount option.

For the 26 TB HDD example, we now get:

mount /dev/sdb /mnt
...
XFS (sdb): 95836 zones of 65536 blocks (128 max open zones)

This change does not prevent the user from specifying a lareger number
for the open zones limit. E.g.

mount -o max_open_zones=4096 /dev/sdb /mnt
...
XFS (sdb): 95836 zones of 65536 blocks (4096 max open zones)

Finally, since xfs_calc_open_zones() checks and caps the
mp->m_max_open_zones limit against the value calculated by
xfs_max_open_zones() for any type of device, this new default limit does
not increase m_max_open_zones for small capacity devices.

Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/libxfs/xfs_zones.h
fs/xfs/xfs_zone_alloc.c

index c4f1367b2cca4d63e1a981b2c07b816fd6e52d5e..5fefd132e002eed6abd17eab65fae5ab8e4e472f 100644 (file)
@@ -29,6 +29,13 @@ struct xfs_rtgroup;
 #define XFS_OPEN_GC_ZONES      1U
 #define XFS_MIN_OPEN_ZONES     (XFS_OPEN_GC_ZONES + 1U)
 
+/*
+ * For zoned devices that do not have a limit on the number of open zones, and
+ * for regular devices using the zoned allocator, use the most common SMR disks
+ * limit (128) as the default limit on the number of open zones.
+ */
+#define XFS_DEFAULT_MAX_OPEN_ZONES     128
+
 bool xfs_zone_validate(struct blk_zone *zone, struct xfs_rtgroup *rtg,
        xfs_rgblock_t *write_pointer);
 
index f152b218200488532d751d0a31d454daa8d7729d..1147bacb2da8e6b85910fd35d11c2ca5b06abf3a 100644 (file)
@@ -1131,7 +1131,7 @@ xfs_calc_open_zones(
                if (bdev_open_zones)
                        mp->m_max_open_zones = bdev_open_zones;
                else
-                       mp->m_max_open_zones = xfs_max_open_zones(mp);
+                       mp->m_max_open_zones = XFS_DEFAULT_MAX_OPEN_ZONES;
        }
 
        if (mp->m_max_open_zones < XFS_MIN_OPEN_ZONES) {