From: Yafang Shao <laoar.shao@gmail.com>
To: darrick.wong@oracle.com, willy@infradead.org,
david@fromorbit.com, hch@infradead.org, mhocko@kernel.org,
akpm@linux-foundation.org, dhowells@redhat.com,
jlayton@redhat.com
Cc: linux-fsdevel@vger.kernel.org, linux-cachefs@redhat.com,
linux-xfs@vger.kernel.org, linux-mm@kvack.org,
oliver.sang@intel.com, Yafang Shao <laoar.shao@gmail.com>,
Christoph Hellwig <hch@lst.de>
Subject: [PATCH v15 3/4] xfs: refactor the usage around xfs_trans_context_{set,clear}
Date: Wed, 13 Jan 2021 18:22:23 +0800 [thread overview]
Message-ID: <20210113102224.13655-4-laoar.shao@gmail.com> (raw)
In-Reply-To: <20210113102224.13655-1-laoar.shao@gmail.com>
The xfs_trans context should be active after it is allocated, and
deactive when it is freed.
The rolling transaction should be specially considered, because in the
case when we clear the old transaction the thread's NOFS state shouldn't
be changed, as a result we have to set NOFS in the old transaction's
t_pflags in xfs_trans_context_swap().
So these helpers are refactored as,
- xfs_trans_context_set()
Used in xfs_trans_alloc()
- xfs_trans_context_clear()
Used in xfs_trans_free()
And a new helper is instroduced to handle the rolling transaction,
- xfs_trans_context_swap()
Used in rolling transaction
This patch is based on Darrick's work[1] to fix the issue in xfs/141 in the
earlier version and Dave's suggestion[2].
[1]. https://lore.kernel.org/linux-xfs/20201104001649.GN7123@magnolia
[2]. https://lore.kernel.org/linux-xfs/20201218000705.GR632069@dread.disaster.area
Cc: Dave Chinner <david@fromorbit.com>
Cc: Darrick J. Wong <darrick.wong@oracle.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
fs/xfs/xfs_trans.c | 25 +++++++++++--------------
fs/xfs/xfs_trans.h | 10 +++++++++-
2 files changed, 20 insertions(+), 15 deletions(-)
diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c
index 43107af569fe..b76e850c9ae7 100644
--- a/fs/xfs/xfs_trans.c
+++ b/fs/xfs/xfs_trans.c
@@ -67,6 +67,10 @@ xfs_trans_free(
xfs_extent_busy_sort(&tp->t_busy);
xfs_extent_busy_clear(tp->t_mountp, &tp->t_busy, false);
+
+ /* Detach the transaction from this thread. */
+ xfs_trans_context_clear(tp);
+
trace_xfs_trans_free(tp, _RET_IP_);
if (!(tp->t_flags & XFS_TRANS_NO_WRITECOUNT))
sb_end_intwrite(tp->t_mountp->m_super);
@@ -119,7 +123,9 @@ xfs_trans_dup(
ntp->t_rtx_res = tp->t_rtx_res - tp->t_rtx_res_used;
tp->t_rtx_res = tp->t_rtx_res_used;
- ntp->t_pflags = tp->t_pflags;
+
+ /* Associate the new transaction with this thread. */
+ xfs_trans_context_swap(tp, ntp);
/* move deferred ops over to the new tp */
xfs_defer_move(ntp, tp);
@@ -153,9 +159,6 @@ xfs_trans_reserve(
int error = 0;
bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0;
- /* Mark this thread as being in a transaction */
- xfs_trans_context_set(tp);
-
/*
* Attempt to reserve the needed disk blocks by decrementing
* the number needed from the number available. This will
@@ -163,10 +166,9 @@ xfs_trans_reserve(
*/
if (blocks > 0) {
error = xfs_mod_fdblocks(mp, -((int64_t)blocks), rsvd);
- if (error != 0) {
- xfs_trans_context_clear(tp);
+ if (error != 0)
return -ENOSPC;
- }
+
tp->t_blk_res += blocks;
}
@@ -241,8 +243,6 @@ xfs_trans_reserve(
tp->t_blk_res = 0;
}
- xfs_trans_context_clear(tp);
-
return error;
}
@@ -284,6 +284,8 @@ xfs_trans_alloc(
INIT_LIST_HEAD(&tp->t_dfops);
tp->t_firstblock = NULLFSBLOCK;
+ /* Mark this thread as being in a transaction */
+ xfs_trans_context_set(tp);
error = xfs_trans_reserve(tp, resp, blocks, rtextents);
if (error) {
xfs_trans_cancel(tp);
@@ -878,7 +880,6 @@ __xfs_trans_commit(
xfs_log_commit_cil(mp, tp, &commit_lsn, regrant);
- xfs_trans_context_clear(tp);
xfs_trans_free(tp);
/*
@@ -911,7 +912,6 @@ __xfs_trans_commit(
tp->t_ticket = NULL;
}
- xfs_trans_context_clear(tp);
xfs_trans_free_items(tp, !!error);
xfs_trans_free(tp);
@@ -971,9 +971,6 @@ xfs_trans_cancel(
tp->t_ticket = NULL;
}
- /* mark this thread as no longer being in a transaction */
- xfs_trans_context_clear(tp);
-
xfs_trans_free_items(tp, dirty);
xfs_trans_free(tp);
}
diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h
index 44b11c64a15e..3645fd0d74b8 100644
--- a/fs/xfs/xfs_trans.h
+++ b/fs/xfs/xfs_trans.h
@@ -277,7 +277,15 @@ xfs_trans_context_set(struct xfs_trans *tp)
static inline void
xfs_trans_context_clear(struct xfs_trans *tp)
{
- memalloc_nofs_restore(tp->t_pflags);
+ if (!tp->t_pflags)
+ memalloc_nofs_restore(tp->t_pflags);
+}
+
+static inline void
+xfs_trans_context_swap(struct xfs_trans *tp, struct xfs_trans *ntp)
+{
+ ntp->t_pflags = tp->t_pflags;
+ tp->t_pflags = -1;
}
#endif /* __XFS_TRANS_H__ */
--
2.17.1
next prev parent reply other threads:[~2021-01-13 10:23 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-13 10:22 [PATCH v15 0/4] xfs: avoid transaction reservation recursion Yafang Shao
2021-01-13 10:22 ` [PATCH v15 1/4] mm: Add become_kswapd and restore_kswapd Yafang Shao
2021-01-13 10:22 ` [PATCH v15 2/4] xfs: use memalloc_nofs_{save,restore} in xfs transaction Yafang Shao
2021-01-13 10:22 ` Yafang Shao [this message]
2021-01-13 10:22 ` [PATCH v15 4/4] xfs: use current->journal_info to avoid transaction reservation recursion Yafang Shao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210113102224.13655-4-laoar.shao@gmail.com \
--to=laoar.shao@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=darrick.wong@oracle.com \
--cc=david@fromorbit.com \
--cc=dhowells@redhat.com \
--cc=hch@infradead.org \
--cc=hch@lst.de \
--cc=jlayton@redhat.com \
--cc=linux-cachefs@redhat.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@vger.kernel.org \
--cc=mhocko@kernel.org \
--cc=oliver.sang@intel.com \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox