diff options
author | Darrick J. Wong <djwong@kernel.org> | 2021-03-25 13:37:01 -0700 |
---|---|---|
committer | Darrick J. Wong <djwong@kernel.org> | 2021-03-25 17:08:23 -0700 |
commit | 20e5a86008fb2400588fc5f9e0f00c07c1f13d99 (patch) | |
tree | 53c89bbd25f0f670725df40a0252bcf87d8524c0 | |
parent | b7ac0a3f0358710ea9e10c2a796d0b408a974eb1 (diff) |
xfs: expose sysfs knob to control inode inactivation delay
Allow administrators to control the length that we defer inode
inactivation. By default we'll set the delay to 2 seconds, as an
arbitrary choice between allowing for some batching of a deltree
operation, and not letting too many inodes pile up in memory.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
-rw-r--r-- | Documentation/admin-guide/xfs.rst | 7 | ||||
-rw-r--r-- | fs/xfs/xfs_globals.c | 3 | ||||
-rw-r--r-- | fs/xfs/xfs_icache.c | 3 | ||||
-rw-r--r-- | fs/xfs/xfs_linux.h | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_sysctl.c | 9 | ||||
-rw-r--r-- | fs/xfs/xfs_sysctl.h | 1 |
6 files changed, 23 insertions, 1 deletions
diff --git a/Documentation/admin-guide/xfs.rst b/Documentation/admin-guide/xfs.rst index f9b109bfc6a6..9dd62b155fda 100644 --- a/Documentation/admin-guide/xfs.rst +++ b/Documentation/admin-guide/xfs.rst @@ -277,6 +277,13 @@ The following sysctls are available for the XFS filesystem: references and returns timed-out AGs back to the free stream pool. + fs.xfs.inode_gc_delay + (Units: centiseconds Min: 0 Default: 1 Max: 360000) + The amount of time to delay cleanup work that happens after a file is + closed by all programs. This involves clearing speculative + preallocations from linked files and freeing unlinked files. A higher + value here increases batching at a risk of background work storms. + fs.xfs.speculative_prealloc_lifetime (Units: seconds Min: 1 Default: 300 Max: 86400) The interval at which the background scanning for inodes diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c index 8c082acb42fe..c5e8bbbcc863 100644 --- a/fs/xfs/xfs_globals.c +++ b/fs/xfs/xfs_globals.c @@ -28,6 +28,9 @@ xfs_param_t xfs_params = { .rotorstep = { 1, 1, 255 }, .inherit_nodfrg = { 0, 1, 1 }, .fstrm_timer = { 1, 30*100, 3600*100}, + .inodegc_timer = { 0, 1, 3600*100}, + + /* Values below here are measured in seconds */ .blockgc_timer = { 1, 300, 3600*24}, }; diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index a5e19db182e2..2dd02b8254fb 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -309,7 +309,8 @@ xfs_inodegc_queue( rcu_read_lock(); if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_INODEGC_TAG)) - queue_delayed_work(mp->m_gc_workqueue, &mp->m_inodegc_work, 0); + queue_delayed_work(mp->m_gc_workqueue, &mp->m_inodegc_work, + msecs_to_jiffies(xfs_inodegc_centisecs * 10)); rcu_read_unlock(); } diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index af6be9b9ccdf..b4c5a2c71f43 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -99,6 +99,7 @@ typedef __u32 xfs_nlink_t; #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val #define xfs_blockgc_secs xfs_params.blockgc_timer.val +#define xfs_inodegc_centisecs xfs_params.inodegc_timer.val #define current_cpu() (raw_smp_processor_id()) #define current_set_flags_nested(sp, f) \ diff --git a/fs/xfs/xfs_sysctl.c b/fs/xfs/xfs_sysctl.c index 546a6cd96729..878f31d3a587 100644 --- a/fs/xfs/xfs_sysctl.c +++ b/fs/xfs/xfs_sysctl.c @@ -177,6 +177,15 @@ static struct ctl_table xfs_table[] = { .extra2 = &xfs_params.fstrm_timer.max, }, { + .procname = "inode_gc_delay", + .data = &xfs_params.inodegc_timer.val, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &xfs_params.inodegc_timer.min, + .extra2 = &xfs_params.inodegc_timer.max + }, + { .procname = "speculative_prealloc_lifetime", .data = &xfs_params.blockgc_timer.val, .maxlen = sizeof(int), diff --git a/fs/xfs/xfs_sysctl.h b/fs/xfs/xfs_sysctl.h index c8ad129b42e7..ba019942655c 100644 --- a/fs/xfs/xfs_sysctl.h +++ b/fs/xfs/xfs_sysctl.h @@ -36,6 +36,7 @@ typedef struct xfs_param { xfs_sysctl_val_t inherit_nodfrg;/* Inherit the "nodefrag" inode flag. */ xfs_sysctl_val_t fstrm_timer; /* Filestream dir-AG assoc'n timeout. */ xfs_sysctl_val_t blockgc_timer; /* Interval between blockgc scans */ + xfs_sysctl_val_t inodegc_timer; /* Inode inactivation scan interval */ } xfs_param_t; /* |