From: Dave Chinner <david@fromorbit.com>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 2/2] xfs: use a separate frextents counter for rt extent reservations
Date: Fri, 8 Apr 2022 10:12:26 +1000 [thread overview]
Message-ID: <20220408001226.GO1544202@dread.disaster.area> (raw)
In-Reply-To: <20220407234528.GD27690@magnolia>
On Thu, Apr 07, 2022 at 04:45:28PM -0700, Darrick J. Wong wrote:
> On Fri, Apr 08, 2022 at 09:17:25AM +1000, Dave Chinner wrote:
> > On Thu, Apr 07, 2022 at 01:47:02PM -0700, Darrick J. Wong wrote:
> > > From: Darrick J. Wong <djwong@kernel.org>
> > > --- a/fs/xfs/xfs_trans.c
> > > +++ b/fs/xfs/xfs_trans.c
> > > @@ -498,10 +498,31 @@ xfs_trans_apply_sb_deltas(
> > > be64_add_cpu(&sbp->sb_fdblocks, tp->t_res_fdblocks_delta);
> > > }
> > >
> > > - if (tp->t_frextents_delta)
> > > - be64_add_cpu(&sbp->sb_frextents, tp->t_frextents_delta);
> > > - if (tp->t_res_frextents_delta)
> > > - be64_add_cpu(&sbp->sb_frextents, tp->t_res_frextents_delta);
> > > + /*
> > > + * Updating frextents requires careful handling because it does not
> > > + * behave like the lazysb counters because we cannot rely on log
> > > + * recovery in older kenels to recompute the value from the rtbitmap.
> > > + * This means that the ondisk frextents must be consistent with the
> > > + * rtbitmap.
> > > + *
> > > + * Therefore, log the frextents change to the ondisk superblock and
> > > + * update the incore superblock so that future calls to xfs_log_sb
> > > + * write the correct value ondisk.
> > > + *
> > > + * Don't touch m_frextents because it includes incore reservations,
> > > + * and those are handled by the unreserve function.
> > > + */
> > > + if (tp->t_frextents_delta || tp->t_res_frextents_delta) {
> > > + struct xfs_mount *mp = tp->t_mountp;
> > > + int64_t rtxdelta;
> > > +
> > > + rtxdelta = tp->t_frextents_delta + tp->t_res_frextents_delta;
> > > +
> > > + spin_lock(&mp->m_sb_lock);
> > > + be64_add_cpu(&sbp->sb_frextents, rtxdelta);
> > > + mp->m_sb.sb_frextents += rtxdelta;
> > > + spin_unlock(&mp->m_sb_lock);
> > > + }
> >
> > Hmmmm. This wants a comment in xfs_log_sb() to explain why we
> > aren't updating mp->m_sb.sb_frextents from mp->m_frextents like we
> > do with all the other per-cpu counters tracking resource usage.
>
> Ok. How about this for xfs_log_sb:
>
> /*
> * Do not update sb_frextents here because it is not part of the lazy sb
> * counters (despite having a percpu counter) and therefore must be
> * consistent with the ondisk rtbitmap.
> */
Good! But i think we can do better. :)
/*
* Do not update sb_frextents here because it is not part of the
* lazy sb counters (despite having a percpu counter). It is always
* kept consistent with the ondisk rtbitmap by
* xfs_trans_apply_sb_deltas() and hence we don't need have to
* update it here.
*/
> > >
> > > if (tp->t_dblocks_delta) {
> > > be64_add_cpu(&sbp->sb_dblocks, tp->t_dblocks_delta);
> > > @@ -614,7 +635,12 @@ xfs_trans_unreserve_and_mod_sb(
> > > if (ifreedelta)
> > > percpu_counter_add(&mp->m_ifree, ifreedelta);
> > >
> > > - if (rtxdelta == 0 && !(tp->t_flags & XFS_TRANS_SB_DIRTY))
> > > + if (rtxdelta) {
> > > + error = xfs_mod_frextents(mp, rtxdelta);
> > > + ASSERT(!error);
> > > + }
> > > +
> > > + if (!(tp->t_flags & XFS_TRANS_SB_DIRTY))
> > > return;
> > >
> > > /* apply remaining deltas */
> > > @@ -622,7 +648,6 @@ xfs_trans_unreserve_and_mod_sb(
> > > mp->m_sb.sb_fdblocks += tp->t_fdblocks_delta + tp->t_res_fdblocks_delta;
> > > mp->m_sb.sb_icount += idelta;
> > > mp->m_sb.sb_ifree += ifreedelta;
> > > - mp->m_sb.sb_frextents += rtxdelta;
> >
> > This makes my head hurt trying to work out if this is necessary or
> > not. (the lazy sb stuff in these functions has always strained my
> > cognitive abilities, even though I wrote it in the first place!)
> >
> > A comment explaining why we don't need to update
> > mp->m_sb.sb_frextents when XFS_TRANS_SB_DIRTY is set would be useful
> > in the above if (rtxdelta) update above.
>
> And how about this?
>
> /*
> * Do not touch sb_frextents here because we are dealing with incore
> * reservation. sb_frextents is not part of the lazy sb counters so it
> * must be consistent with the ondisk rtibitmap and must never include
> * incore reservations.
> */
Yup, makes sense :)
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
prev parent reply other threads:[~2022-04-08 0:12 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-07 20:46 [PATCHSET 0/2] xfs: fix corruption of free rt extent count Darrick J. Wong
2022-04-07 20:46 ` [PATCH 1/2] xfs: recalculate free rt extents after log recovery Darrick J. Wong
2022-04-07 21:56 ` Dave Chinner
2022-04-07 23:39 ` Darrick J. Wong
2022-04-08 0:06 ` Dave Chinner
2022-04-08 17:42 ` Darrick J. Wong
2022-04-07 20:47 ` [PATCH 2/2] xfs: use a separate frextents counter for rt extent reservations Darrick J. Wong
2022-04-07 23:17 ` Dave Chinner
2022-04-07 23:45 ` Darrick J. Wong
2022-04-08 0:12 ` Dave Chinner [this message]
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=20220408001226.GO1544202@dread.disaster.area \
--to=david@fromorbit.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