summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2020-09-25 17:39:58 -0700
committerDarrick J. Wong <darrick.wong@oracle.com>2020-10-07 08:40:29 -0700
commit74f4d6a1e065c92428c5b588099e307a582d79d9 (patch)
treec16022a929ed47e22f1514f40cadc44720316326
parented1575daf71e4e21d8ae735b6e687c95454aaa17 (diff)
downloadlinux-74f4d6a1e065c92428c5b588099e307a582d79d9.tar.gz
linux-74f4d6a1e065c92428c5b588099e307a582d79d9.tar.bz2
linux-74f4d6a1e065c92428c5b588099e307a582d79d9.zip
xfs: only relog deferred intent items if free space in the log gets low
Now that we have the ability to ask the log how far the tail needs to be pushed to maintain its free space targets, augment the decision to relog an intent item so that we only do it if the log has hit the 75% full threshold. There's no point in relogging an intent into the same checkpoint, and there's no need to relog if there's plenty of free space in the log. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
-rw-r--r--fs/xfs/libxfs/xfs_defer.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c
index fbe64933bcc9..eff4a127188e 100644
--- a/fs/xfs/libxfs/xfs_defer.c
+++ b/fs/xfs/libxfs/xfs_defer.c
@@ -356,7 +356,10 @@ xfs_defer_relog(
struct xfs_trans **tpp,
struct list_head *dfops)
{
+ struct xlog *log = (*tpp)->t_mountp->m_log;
struct xfs_defer_pending *dfp;
+ xfs_lsn_t threshold_lsn = NULLCOMMITLSN;
+
ASSERT((*tpp)->t_flags & XFS_TRANS_PERM_LOG_RES);
@@ -372,6 +375,19 @@ xfs_defer_relog(
xfs_log_item_in_current_chkpt(dfp->dfp_intent))
continue;
+ /*
+ * Figure out where we need the tail to be in order to maintain
+ * the minimum required free space in the log. Only sample
+ * the log threshold once per call.
+ */
+ if (threshold_lsn == NULLCOMMITLSN) {
+ threshold_lsn = xlog_grant_push_threshold(log, 0);
+ if (threshold_lsn == NULLCOMMITLSN)
+ break;
+ }
+ if (XFS_LSN_CMP(dfp->dfp_intent->li_lsn, threshold_lsn) >= 0)
+ continue;
+
trace_xfs_defer_relog_intent((*tpp)->t_mountp, dfp);
XFS_STATS_INC((*tpp)->t_mountp, defer_relog);
dfp->dfp_intent = xfs_trans_item_relog(dfp->dfp_intent, *tpp);