提交 04502e84 编写于 作者: D Darrick J. Wong 提交者: Zheng Zengkai

xfs: queue inactivation immediately when free space is tight

mainline-inclusion
from mainline-v5.14-rc4
commit 7d6f07d2
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I4KIAO
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7d6f07d2c5ad9fce298889eeed317d512a2df8cd

-------------------------------------------------

Now that we have made the inactivation of unlinked inodes a background
task to increase the throughput of file deletions, we need to be a
little more careful about how long of a delay we can tolerate.

On a mostly empty filesystem, the risk of the allocator making poor
decisions due to fragmentation of the free space on account a lengthy
delay in background updates is minimal because there's plenty of space.
However, if free space is tight, we want to deallocate unlinked inodes
as quickly as possible to avoid fallocate ENOSPC and to give the
allocator the best shot at optimal allocations for new writes.

Therefore, queue the percpu worker immediately if the filesystem is more
than 95% full.  This follows the same principle that XFS becomes less
aggressive about speculative allocations and lazy cleanup (and more
precise about accounting) when nearing full.
Signed-off-by: NDarrick J. Wong <djwong@kernel.org>
Reviewed-by: NDave Chinner <dchinner@redhat.com>
Signed-off-by: NLihong Kou <koulihong@huawei.com>
Reviewed-by: NZhang Yi <yi.zhang@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 705fccfb
...@@ -1928,6 +1928,7 @@ xfs_inodegc_start( ...@@ -1928,6 +1928,7 @@ xfs_inodegc_start(
* Schedule the inactivation worker when: * Schedule the inactivation worker when:
* *
* - We've accumulated more than one inode cluster buffer's worth of inodes. * - We've accumulated more than one inode cluster buffer's worth of inodes.
* - There is less than 5% free space left.
*/ */
static inline bool static inline bool
xfs_inodegc_want_queue_work( xfs_inodegc_want_queue_work(
...@@ -1939,6 +1940,11 @@ xfs_inodegc_want_queue_work( ...@@ -1939,6 +1940,11 @@ xfs_inodegc_want_queue_work(
if (items > mp->m_ino_geo.inodes_per_cluster) if (items > mp->m_ino_geo.inodes_per_cluster)
return true; return true;
if (__percpu_counter_compare(&mp->m_fdblocks,
mp->m_low_space[XFS_LOWSP_5_PCNT],
XFS_FDBLOCKS_BATCH) < 0)
return true;
return false; return false;
} }
......
...@@ -1221,14 +1221,6 @@ xfs_log_sbcount(xfs_mount_t *mp) ...@@ -1221,14 +1221,6 @@ xfs_log_sbcount(xfs_mount_t *mp)
return xfs_sync_sb(mp, true); return xfs_sync_sb(mp, true);
} }
/*
* Deltas for the block count can vary from 1 to very large, but lock contention
* only occurs on frequent small block count updates such as in the delayed
* allocation path for buffered writes (page a time updates). Hence we set
* a large batch count (1024) to minimise global counter updates except when
* we get near to ENOSPC and we have to be very accurate with our updates.
*/
#define XFS_FDBLOCKS_BATCH 1024
int int
xfs_mod_fdblocks( xfs_mod_fdblocks(
struct xfs_mount *mp, struct xfs_mount *mp,
......
...@@ -447,6 +447,15 @@ extern int xfs_initialize_perag(xfs_mount_t *mp, xfs_agnumber_t agcount, ...@@ -447,6 +447,15 @@ extern int xfs_initialize_perag(xfs_mount_t *mp, xfs_agnumber_t agcount,
xfs_agnumber_t *maxagi); xfs_agnumber_t *maxagi);
extern void xfs_unmountfs(xfs_mount_t *); extern void xfs_unmountfs(xfs_mount_t *);
/*
* Deltas for the block count can vary from 1 to very large, but lock contention
* only occurs on frequent small block count updates such as in the delayed
* allocation path for buffered writes (page a time updates). Hence we set
* a large batch count (1024) to minimise global counter updates except when
* we get near to ENOSPC and we have to be very accurate with our updates.
*/
#define XFS_FDBLOCKS_BATCH 1024
extern int xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta, extern int xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta,
bool reserved); bool reserved);
extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta); extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册