summaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_zone_alloc.c
diff options
context:
space:
mode:
authorHans Holmberg <Hans.Holmberg@wdc.com>2025-03-25 09:10:49 +0000
committerCarlos Maiolino <cem@kernel.org>2025-04-14 10:41:33 +0200
commit845abeb1f06a8a44e21314460eeb14cddfca52cc (patch)
treef5e453da592114ec67f8abc47b6808ee22eaab07 /fs/xfs/xfs_zone_alloc.c
parenta1a56f541a8f634007de4bcb45aa3eaf803154a8 (diff)
downloadlinux-845abeb1f06a8a44e21314460eeb14cddfca52cc.tar.gz
linux-845abeb1f06a8a44e21314460eeb14cddfca52cc.tar.bz2
linux-845abeb1f06a8a44e21314460eeb14cddfca52cc.zip
xfs: add tunable threshold parameter for triggering zone GC
Presently we start garbage collection late - when we start running out of free zones to backfill max_open_zones. This is a reasonable default as it minimizes write amplification. The longer we wait, the more blocks are invalidated and reclaim cost less in terms of blocks to relocate. Starting this late however introduces a risk of GC being outcompeted by user writes. If GC can't keep up, user writes will be forced to wait for free zones with high tail latencies as a result. This is not a problem under normal circumstances, but if fragmentation is bad and user write pressure is high (multiple full-throttle writers) we will "bottom out" of free zones. To mitigate this, introduce a zonegc_low_space tunable that lets the user specify a percentage of how much of the unused space that GC should keep available for writing. A high value will reclaim more of the space occupied by unused blocks, creating a larger buffer against write bursts. This comes at a cost as write amplification is increased. To illustrate this using a sample workload, setting zonegc_low_space to 60% avoids high (500ms) max latencies while increasing write amplification by 15%. Signed-off-by: Hans Holmberg <hans.holmberg@wdc.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Carlos Maiolino <cem@kernel.org>
Diffstat (limited to 'fs/xfs/xfs_zone_alloc.c')
-rw-r--r--fs/xfs/xfs_zone_alloc.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/xfs/xfs_zone_alloc.c b/fs/xfs/xfs_zone_alloc.c
index 52af234936a2..d509e49b2aaa 100644
--- a/fs/xfs/xfs_zone_alloc.c
+++ b/fs/xfs/xfs_zone_alloc.c
@@ -1201,6 +1201,13 @@ xfs_mount_zones(
xfs_set_freecounter(mp, XC_FREE_RTEXTENTS,
iz.available + iz.reclaimable);
+ /*
+ * The user may configure GC to free up a percentage of unused blocks.
+ * By default this is 0. GC will always trigger at the minimum level
+ * for keeping max_open_zones available for data placement.
+ */
+ mp->m_zonegc_low_space = 0;
+
error = xfs_zone_gc_mount(mp);
if (error)
goto out_free_zone_info;