From: Allison Henderson <allison.henderson@oracle.com>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH v25 02/12] xfs: don't commit the first deferred transaction without intents
Date: Wed, 1 Dec 2021 00:34:10 -0700 [thread overview]
Message-ID: <1631f724-ce5a-3b7b-cbe2-6cb6daca45cd@oracle.com> (raw)
In-Reply-To: <20211123232853.GX266024@magnolia>
On 11/23/21 4:28 PM, Darrick J. Wong wrote:
> On Tue, Nov 16, 2021 at 09:13:33PM -0700, Allison Henderson wrote:
>> If the first operation in a string of defer ops has no intents,
>> then there is no reason to commit it before running the first call
>> to xfs_defer_finish_one(). This allows the defer ops to be used
>> effectively for non-intent based operations without requiring an
>> unnecessary extra transaction commit when first called.
>>
>> This fixes a regression in per-attribute modification transaction
>> count when delayed attributes are not being used.
>>
>> Signed-off-by: Dave Chinner <dchinner@redhat.com>
>> Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
>> ---
>> fs/xfs/libxfs/xfs_defer.c | 29 +++++++++++++++++------------
>> 1 file changed, 17 insertions(+), 12 deletions(-)
>>
>> diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c
>> index 6dac8d6b8c21..51574f0371b5 100644
>> --- a/fs/xfs/libxfs/xfs_defer.c
>> +++ b/fs/xfs/libxfs/xfs_defer.c
>> @@ -187,7 +187,7 @@ static const struct xfs_defer_op_type *defer_op_types[] = {
>> [XFS_DEFER_OPS_TYPE_AGFL_FREE] = &xfs_agfl_free_defer_type,
>> };
>>
>> -static void
>> +static bool
>> xfs_defer_create_intent(
>> struct xfs_trans *tp,
>> struct xfs_defer_pending *dfp,
>> @@ -198,6 +198,7 @@ xfs_defer_create_intent(
>> if (!dfp->dfp_intent)
>> dfp->dfp_intent = ops->create_intent(tp, &dfp->dfp_work,
>> dfp->dfp_count, sort);
>> + return dfp->dfp_intent;
>
> Nit: This ought to be "return dfp->dfp_intent != NULL" to reinforce that
> we're returning whether or not the dfp has an associated log item vs.
> returning the actual log item.
Sure, I can add that in
>
>> }
>>
>> /*
>> @@ -205,16 +206,18 @@ xfs_defer_create_intent(
>> * associated extents, then add the entire intake list to the end of
>> * the pending list.
>> */
>> -STATIC void
>> +STATIC bool
>> xfs_defer_create_intents(
>> struct xfs_trans *tp)
>> {
>> struct xfs_defer_pending *dfp;
>> + bool ret = false;
>>
>> list_for_each_entry(dfp, &tp->t_dfops, dfp_list) {
>> trace_xfs_defer_create_intent(tp->t_mountp, dfp);
>> - xfs_defer_create_intent(tp, dfp, true);
>> + ret |= xfs_defer_create_intent(tp, dfp, true);
>> }
>> + return ret;
>> }
>>
>> /* Abort all the intents that were committed. */
>> @@ -488,7 +491,7 @@ int
>> xfs_defer_finish_noroll(
>> struct xfs_trans **tp)
>> {
>> - struct xfs_defer_pending *dfp;
>> + struct xfs_defer_pending *dfp = NULL;
>> int error = 0;
>> LIST_HEAD(dop_pending);
>>
>> @@ -507,17 +510,19 @@ xfs_defer_finish_noroll(
>> * of time that any one intent item can stick around in memory,
>> * pinning the log tail.
>> */
>> - xfs_defer_create_intents(*tp);
>> + bool has_intents = xfs_defer_create_intents(*tp);
>> list_splice_init(&(*tp)->t_dfops, &dop_pending);
>>
>> - error = xfs_defer_trans_roll(tp);
>> - if (error)
>> - goto out_shutdown;
>> + if (has_intents || dfp) {
>
> I can't help but wonder if it would be simpler to make the xattr code
> walk through the delattr state machine until there's actually an intent
> to log? I forget, which patch in this series actually sets up this
> situation?
xfs_attr_set_iter is the function that figures out if we need to go
around again. That function was merged as part of the refactoring
subseries. From here, I think it gets called through the
xfs_defer_finish_one function below, it's just a line or two below where
the diff cuts off. The *_iter routine needs a place to stash away the
state machine and other such things it needs to keep track of once the
operation starts, which in this case is the item.
I'll fiddle with some ideas, it might be possible to use the state of
the attr fork to figure out a chunk of cases that might not need to be
logged, and then just return null in the create_intent call back.
>
> Atomic extent swapping sort of has a similar situation in that the first
> transaction logs the inode core update and the swapext intent item, and
> that's it.
Thanks for the reviews!
Allison
>
> --D
>
>> + error = xfs_defer_trans_roll(tp);
>> + if (error)
>> + goto out_shutdown;
>>
>> - /* Possibly relog intent items to keep the log moving. */
>> - error = xfs_defer_relog(tp, &dop_pending);
>> - if (error)
>> - goto out_shutdown;
>> + /* Possibly relog intent items to keep the log moving. */
>> + error = xfs_defer_relog(tp, &dop_pending);
>> + if (error)
>> + goto out_shutdown;
>> + }
>>
>> dfp = list_first_entry(&dop_pending, struct xfs_defer_pending,
>> dfp_list);
>> --
>> 2.25.1
>>
next prev parent reply other threads:[~2021-12-01 7:34 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-17 4:13 [PATCH v25 00/12] Log Attribute Replay Allison Henderson
2021-11-17 4:13 ` [PATCH v25 01/12] xfs: Fix double unlock in defer capture code Allison Henderson
2021-11-17 4:13 ` [PATCH v25 02/12] xfs: don't commit the first deferred transaction without intents Allison Henderson
2021-11-23 23:28 ` Darrick J. Wong
2021-12-01 7:34 ` Allison Henderson [this message]
2021-11-17 4:13 ` [PATCH v25 03/12] xfs: Return from xfs_attr_set_iter if there are no more rmtblks to process Allison Henderson
2021-11-17 4:13 ` [PATCH v25 04/12] xfs: Set up infrastructure for log attribute replay Allison Henderson
2021-11-23 23:50 ` Darrick J. Wong
2021-12-01 7:35 ` Allison Henderson
2021-11-17 4:13 ` [PATCH v25 05/12] xfs: Implement attr logging and replay Allison Henderson
2021-11-24 0:11 ` Darrick J. Wong
2021-12-01 7:34 ` Allison Henderson
2021-12-01 17:52 ` Darrick J. Wong
2021-11-17 4:13 ` [PATCH v25 06/12] xfs: Skip flip flags for delayed attrs Allison Henderson
2021-11-17 4:13 ` [PATCH v25 07/12] xfs: Add xfs_attr_set_deferred and xfs_attr_remove_deferred Allison Henderson
2021-11-17 4:13 ` [PATCH v25 08/12] xfs: Remove unused xfs_attr_*_args Allison Henderson
2021-11-17 4:13 ` [PATCH v25 09/12] xfs: Add log attribute error tag Allison Henderson
2021-11-17 4:13 ` [PATCH v25 10/12] xfs: Add larp debug option Allison Henderson
2021-11-23 23:29 ` Darrick J. Wong
2021-12-01 7:34 ` Allison Henderson
2021-11-17 4:13 ` [PATCH v25 11/12] xfs: Merge xfs_delattr_context into xfs_attr_item Allison Henderson
2021-11-17 4:13 ` [PATCH v25 12/12] xfs: Add helper function xfs_attr_leaf_addname Allison Henderson
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=1631f724-ce5a-3b7b-cbe2-6cb6daca45cd@oracle.com \
--to=allison.henderson@oracle.com \
--cc=djwong@kernel.org \
--cc=linux-xfs@vger.kernel.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;
as well as URLs for NNTP newsgroup(s).