Thread (47 messages) 47 messages, 2 authors, 2021-08-04
STALE1783d

[PATCH 18/20] xfs: scale speculative preallocation gc delay based on free space

From: "Darrick J. Wong" <djwong@kernel.org>
Date: 2021-07-29 18:45:34
Subsystem: filesystems (vfs and infrastructure), the rest, xfs filesystem · Maintainers: Alexander Viro, Christian Brauner, Linus Torvalds, Carlos Maiolino

From: Darrick J. Wong <djwong@kernel.org>

Now that we have the ability to scale down the lag between scheduling
and executing background cleanup work for inode inactivations, apply the
same logic to speculative preallocation gc.  In other words, be more
proactive about trimming unused speculative preallocations if space is
low.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 fs/xfs/xfs_icache.c |   20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
index 9b1274f25ed0..59a9526a25ff 100644
--- a/fs/xfs/xfs_icache.c
+++ b/fs/xfs/xfs_icache.c
@@ -426,6 +426,9 @@ xfs_gc_delay_ms(
 			return 0;
 		}
 		break;
+	case XFS_ICI_BLOCKGC_TAG:
+		default_ms = xfs_blockgc_secs * 1000;
+		break;
 	default:
 		ASSERT(0);
 		return 0;
@@ -453,7 +456,8 @@ xfs_gc_delay_ms(
  */
 static inline void
 xfs_blockgc_queue(
-	struct xfs_perag	*pag)
+	struct xfs_perag	*pag,
+	struct xfs_inode	*ip)
 {
 	struct xfs_mount        *mp = pag->pag_mount;
 
@@ -462,8 +466,9 @@ xfs_blockgc_queue(
 
 	rcu_read_lock();
 	if (radix_tree_tagged(&pag->pag_ici_root, XFS_ICI_BLOCKGC_TAG)) {
-		unsigned int	delay = xfs_blockgc_secs * 1000;
+		unsigned int	delay;
 
+		delay = xfs_gc_delay_ms(pag, ip, XFS_ICI_BLOCKGC_TAG);
 		trace_xfs_blockgc_queue(pag, delay);
 		queue_delayed_work(mp->m_gc_workqueue, &pag->pag_blockgc_work,
 				msecs_to_jiffies(delay));
@@ -519,6 +524,11 @@ xfs_gc_requeue_now(
 		default_ms = xfs_inodegc_ms;
 		opflag_bit = XFS_OPFLAG_INODEGC_RUNNING_BIT;
 		break;
+	case XFS_ICI_BLOCKGC_TAG:
+		dwork = &pag->pag_blockgc_work;
+		default_ms = xfs_blockgc_secs * 1000;
+		opflag_bit = XFS_OPFLAG_BLOCKGC_RUNNING_BIT;
+		break;
 	default:
 		return;
 	}
@@ -577,7 +587,7 @@ xfs_perag_set_inode_tag(
 		xfs_reclaim_work_queue(mp);
 		break;
 	case XFS_ICI_BLOCKGC_TAG:
-		xfs_blockgc_queue(pag);
+		xfs_blockgc_queue(pag, ip);
 		break;
 	case XFS_ICI_INODEGC_TAG:
 		xfs_inodegc_queue(pag, ip);
@@ -1815,7 +1825,7 @@ xfs_blockgc_start(
 
 	trace_xfs_blockgc_start(mp, __return_address);
 	for_each_perag_tag(mp, agno, pag, XFS_ICI_BLOCKGC_TAG)
-		xfs_blockgc_queue(pag);
+		xfs_blockgc_queue(pag, NULL);
 }
 
 /* Don't try to run block gc on an inode that's in any of these states. */
@@ -1906,7 +1916,7 @@ xfs_blockgc_worker(
 	if (error)
 		xfs_info(mp, "AG %u preallocation gc worker failed, err=%d",
 				pag->pag_agno, error);
-	xfs_blockgc_queue(pag);
+	xfs_blockgc_queue(pag, NULL);
 }
 
 /*
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help