Re: [PATCH v2 2/3] xfs: support additional levels in the agfl minimum calculation
"Darrick J. Wong" <[email protected]>
| Newsgroups | org.kernel.vger.linux-xfs |
|---|---|
| Message-ID | <20260814185811.GK3556460@frogsfrogsfrogs> |
On Fri, Aug 14, 2026 at 09:22:38AM -0400, Brian Foster wrote: > xfs_alloc_min_freelist() calculates the worst case AGFL block > requirement for a full split plus partial refill for each alloc > btree. An upcoming patch needs to calculate the requirement for > multiple level increases, so add an optional extra levels parameter > and factor out a wrapper function for the common case of a single > split. No functional changes. > > Assisted-by: LLM > Signed-off-by: Brian Foster <[email protected]> This looks like a simple enough hoist, so I'll move on to the next patch to see how it's used. In the meantime, Reviewed-by: "Darrick J. Wong" <[email protected]> --D > --- > fs/xfs/libxfs/xfs_alloc.c | 31 +++++++++++++++++++++++-------- > 1 file changed, 23 insertions(+), 8 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index d99602bcc16f..dbb85fb6314b 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -2439,17 +2439,22 @@ xfs_alloc_longest_free_extent( > > /* > * Compute the minimum length of the AGFL in the given AG. If @pag is NULL, > - * return the largest possible minimum length. > + * return the largest possible minimum length. The base calculation accounts > + * for a single full split per btree. @extra_levels adds additional split > + * levels to compute the prospective AGFL requirement increase for > + * multi-allocation transactions. > */ > -unsigned int > -xfs_alloc_min_freelist( > +static unsigned int > +__xfs_alloc_min_freelist( > struct xfs_mount *mp, > - struct xfs_perag *pag) > + struct xfs_perag *pag, > + unsigned int extra_levels) > { > /* AG btrees have at least 1 level. */ > const unsigned int bno_level = pag ? pag->pagf_bno_level : 1; > const unsigned int cnt_level = pag ? pag->pagf_cnt_level : 1; > const unsigned int rmap_level = pag ? pag->pagf_rmap_level : 1; > + const unsigned int levels = 1 + extra_levels; > unsigned int min_free; > > ASSERT(mp->m_alloc_maxlevels > 0); > @@ -2476,15 +2481,25 @@ xfs_alloc_min_freelist( > */ > > /* space needed by-bno freespace btree */ > - min_free = min(bno_level + 1, mp->m_alloc_maxlevels) * 2 - 2; > + min_free = min(bno_level + levels, mp->m_alloc_maxlevels) * 2 - 2; > /* space needed by-size freespace btree */ > - min_free += min(cnt_level + 1, mp->m_alloc_maxlevels) * 2 - 2; > + min_free += min(cnt_level + levels, mp->m_alloc_maxlevels) * 2 - 2; > /* space needed reverse mapping used space btree */ > - if (xfs_has_rmapbt(mp)) > - min_free += min(rmap_level + 1, mp->m_rmap_maxlevels) * 2 - 2; > + if (xfs_has_rmapbt(mp)) { > + min_free += min(rmap_level + levels, > + mp->m_rmap_maxlevels) * 2 - 2; > + } > return min_free; > } > > +unsigned int > +xfs_alloc_min_freelist( > + struct xfs_mount *mp, > + struct xfs_perag *pag) > +{ > + return __xfs_alloc_min_freelist(mp, pag, 0); > +} > + > /* > * Check if the operation we are fixing up the freelist for should go ahead or > * not. If we are freeing blocks, we always allow it, otherwise the allocation > -- > 2.55.0 > >