diff mbox series

[12/17] xfs: compute maximum AG btree height for critical reservation calculation

Message ID 163424268093.756780.1167437160420772989.stgit@magnolia (mailing list archive)
State Accepted
Headers show
Series xfs: support dynamic btree cursor height | expand

Commit Message

Darrick J. Wong Oct. 14, 2021, 8:18 p.m. UTC
From: Darrick J. Wong <djwong@kernel.org>

Compute the actual maximum AG btree height for deciding if a per-AG
block reservation is critically low.  This only affects the sanity check
condition, since we /generally/ will trigger on the 10% threshold.  This
is a long-winded way of saying that we're removing one more usage of
XFS_BTREE_MAXLEVELS.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 fs/xfs/libxfs/xfs_ag_resv.c |    3 ++-
 fs/xfs/xfs_mount.c          |   14 ++++++++++++++
 fs/xfs/xfs_mount.h          |    1 +
 3 files changed, 17 insertions(+), 1 deletion(-)

Comments

Dave Chinner Oct. 14, 2021, 10:54 p.m. UTC | #1
On Thu, Oct 14, 2021 at 01:18:00PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
> 
> Compute the actual maximum AG btree height for deciding if a per-AG
> block reservation is critically low.  This only affects the sanity check
> condition, since we /generally/ will trigger on the 10% threshold.  This
> is a long-winded way of saying that we're removing one more usage of
> XFS_BTREE_MAXLEVELS.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
>  fs/xfs/libxfs/xfs_ag_resv.c |    3 ++-
>  fs/xfs/xfs_mount.c          |   14 ++++++++++++++
>  fs/xfs/xfs_mount.h          |    1 +
>  3 files changed, 17 insertions(+), 1 deletion(-)

One minor nit below, otherwise it looks good.

Reviewed-by: Dave Chinner <dchinner@redhat.com>

> 
> 
> diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c
> index 2aa2b3484c28..fe94058d4e9e 100644
> --- a/fs/xfs/libxfs/xfs_ag_resv.c
> +++ b/fs/xfs/libxfs/xfs_ag_resv.c
> @@ -91,7 +91,8 @@ xfs_ag_resv_critical(
>  	trace_xfs_ag_resv_critical(pag, type, avail);
>  
>  	/* Critically low if less than 10% or max btree height remains. */
> -	return XFS_TEST_ERROR(avail < orig / 10 || avail < XFS_BTREE_MAXLEVELS,
> +	return XFS_TEST_ERROR(avail < orig / 10 ||
> +			      avail < pag->pag_mount->m_agbtree_maxlevels,
>  			pag->pag_mount, XFS_ERRTAG_AG_RESV_CRITICAL);
>  }
>  
> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
> index 06dac09eddbd..5be1dd63fac5 100644
> --- a/fs/xfs/xfs_mount.c
> +++ b/fs/xfs/xfs_mount.c
> @@ -567,6 +567,18 @@ xfs_mount_setup_inode_geom(
>  	xfs_ialloc_setup_geometry(mp);
>  }
>  
> +/* Compute maximum possible height for per-AG btree types for this fs. */
> +static inline void
> +xfs_agbtree_compute_maxlevels(
> +	struct xfs_mount	*mp)
> +{
> +	unsigned int		ret;
> +
> +	ret = max(mp->m_alloc_maxlevels, M_IGEO(mp)->inobt_maxlevels);
> +	ret = max(ret, mp->m_rmap_maxlevels);
> +	mp->m_agbtree_maxlevels = max(ret, mp->m_refc_maxlevels);
> +}

"ret" should really be named "levels" here because it's not a return
value anymore...

Cheers,

Dave.
Darrick J. Wong Oct. 15, 2021, 12:44 a.m. UTC | #2
On Fri, Oct 15, 2021 at 09:54:47AM +1100, Dave Chinner wrote:
> On Thu, Oct 14, 2021 at 01:18:00PM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <djwong@kernel.org>
> > 
> > Compute the actual maximum AG btree height for deciding if a per-AG
> > block reservation is critically low.  This only affects the sanity check
> > condition, since we /generally/ will trigger on the 10% threshold.  This
> > is a long-winded way of saying that we're removing one more usage of
> > XFS_BTREE_MAXLEVELS.
> > 
> > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > ---
> >  fs/xfs/libxfs/xfs_ag_resv.c |    3 ++-
> >  fs/xfs/xfs_mount.c          |   14 ++++++++++++++
> >  fs/xfs/xfs_mount.h          |    1 +
> >  3 files changed, 17 insertions(+), 1 deletion(-)
> 
> One minor nit below, otherwise it looks good.
> 
> Reviewed-by: Dave Chinner <dchinner@redhat.com>
> 
> > 
> > 
> > diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c
> > index 2aa2b3484c28..fe94058d4e9e 100644
> > --- a/fs/xfs/libxfs/xfs_ag_resv.c
> > +++ b/fs/xfs/libxfs/xfs_ag_resv.c
> > @@ -91,7 +91,8 @@ xfs_ag_resv_critical(
> >  	trace_xfs_ag_resv_critical(pag, type, avail);
> >  
> >  	/* Critically low if less than 10% or max btree height remains. */
> > -	return XFS_TEST_ERROR(avail < orig / 10 || avail < XFS_BTREE_MAXLEVELS,
> > +	return XFS_TEST_ERROR(avail < orig / 10 ||
> > +			      avail < pag->pag_mount->m_agbtree_maxlevels,
> >  			pag->pag_mount, XFS_ERRTAG_AG_RESV_CRITICAL);
> >  }
> >  
> > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
> > index 06dac09eddbd..5be1dd63fac5 100644
> > --- a/fs/xfs/xfs_mount.c
> > +++ b/fs/xfs/xfs_mount.c
> > @@ -567,6 +567,18 @@ xfs_mount_setup_inode_geom(
> >  	xfs_ialloc_setup_geometry(mp);
> >  }
> >  
> > +/* Compute maximum possible height for per-AG btree types for this fs. */
> > +static inline void
> > +xfs_agbtree_compute_maxlevels(
> > +	struct xfs_mount	*mp)
> > +{
> > +	unsigned int		ret;
> > +
> > +	ret = max(mp->m_alloc_maxlevels, M_IGEO(mp)->inobt_maxlevels);
> > +	ret = max(ret, mp->m_rmap_maxlevels);
> > +	mp->m_agbtree_maxlevels = max(ret, mp->m_refc_maxlevels);
> > +}
> 
> "ret" should really be named "levels" here because it's not a return
> value anymore...

Fixed.

--D

> Cheers,
> 
> Dave.
> -- 
> Dave Chinner
> david@fromorbit.com
diff mbox series

Patch

diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c
index 2aa2b3484c28..fe94058d4e9e 100644
--- a/fs/xfs/libxfs/xfs_ag_resv.c
+++ b/fs/xfs/libxfs/xfs_ag_resv.c
@@ -91,7 +91,8 @@  xfs_ag_resv_critical(
 	trace_xfs_ag_resv_critical(pag, type, avail);
 
 	/* Critically low if less than 10% or max btree height remains. */
-	return XFS_TEST_ERROR(avail < orig / 10 || avail < XFS_BTREE_MAXLEVELS,
+	return XFS_TEST_ERROR(avail < orig / 10 ||
+			      avail < pag->pag_mount->m_agbtree_maxlevels,
 			pag->pag_mount, XFS_ERRTAG_AG_RESV_CRITICAL);
 }
 
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
index 06dac09eddbd..5be1dd63fac5 100644
--- a/fs/xfs/xfs_mount.c
+++ b/fs/xfs/xfs_mount.c
@@ -567,6 +567,18 @@  xfs_mount_setup_inode_geom(
 	xfs_ialloc_setup_geometry(mp);
 }
 
+/* Compute maximum possible height for per-AG btree types for this fs. */
+static inline void
+xfs_agbtree_compute_maxlevels(
+	struct xfs_mount	*mp)
+{
+	unsigned int		ret;
+
+	ret = max(mp->m_alloc_maxlevels, M_IGEO(mp)->inobt_maxlevels);
+	ret = max(ret, mp->m_rmap_maxlevels);
+	mp->m_agbtree_maxlevels = max(ret, mp->m_refc_maxlevels);
+}
+
 /*
  * This function does the following on an initial mount of a file system:
  *	- reads the superblock from disk and init the mount struct
@@ -638,6 +650,8 @@  xfs_mountfs(
 	xfs_rmapbt_compute_maxlevels(mp);
 	xfs_refcountbt_compute_maxlevels(mp);
 
+	xfs_agbtree_compute_maxlevels(mp);
+
 	/*
 	 * Check if sb_agblocks is aligned at stripe boundary.  If sb_agblocks
 	 * is NOT aligned turn off m_dalign since allocator alignment is within
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
index e4b7a8eb0d06..00720a02e761 100644
--- a/fs/xfs/xfs_mount.h
+++ b/fs/xfs/xfs_mount.h
@@ -132,6 +132,7 @@  typedef struct xfs_mount {
 	uint			m_bm_maxlevels[2]; /* max bmap btree levels */
 	uint			m_rmap_maxlevels; /* max rmap btree levels */
 	uint			m_refc_maxlevels; /* max refcount btree level */
+	unsigned int		m_agbtree_maxlevels; /* max level of all AG btrees */
 	xfs_extlen_t		m_ag_prealloc_blocks; /* reserved ag blocks */
 	uint			m_alloc_set_aside; /* space we can't use */
 	uint			m_ag_max_usable; /* max space per AG */