[PATCH 3/3] xfs: Increase the default size of the reserved blocks pool
Alex Elder
aelder at sgi.com
Fri Mar 5 09:45:53 CST 2010
On Thu, 2010-03-04 at 12:46 +1100, Dave Chinner wrote:
> The current default size of the reserved blocks pool is easy to deplete
> with certain workloads, in particular workloads that do lots of concurrent
> delayed allocation extent conversions. If enough transactions are running
> in parallel and the entire pool is consumed then subsequent calls to
> xfs_trans_reserve() will fail with ENOSPC. Also add a rate limited
> warning so we know if this starts happening again.
>
> This is an updated version of an old patch from Lachlan McIlroy.
Looks good. The comment and code rearrangements are an
improvement.
I have also reviewed the other two patches in the series
(including the updated patch 2) and they too look good.
> Signed-off-by: Dave Chinner <david at fromorbit.com>
So is it got to be fromorbit or redhat?
(You used both in this series.)
Reviewed-by: Alex Elder <aelder at sgi.com>
> ---
> fs/xfs/xfs_mount.c | 49 +++++++++++++++++++++++++++++--------------------
> 1 files changed, 29 insertions(+), 20 deletions(-)
>
> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
> index c207fef..e79b56b 100644
> --- a/fs/xfs/xfs_mount.c
> +++ b/fs/xfs/xfs_mount.c
> @@ -1097,13 +1097,15 @@ xfs_default_resblks(xfs_mount_t *mp)
> __uint64_t resblks;
>
> /*
> - * We default to 5% or 1024 fsbs of space reserved, whichever is smaller.
> - * This may drive us straight to ENOSPC on mount, but that implies
> - * we were already there on the last unmount. Warn if this occurs.
> + * We default to 5% or 8192 fsbs of space reserved, whichever is
> + * smaller. This is intended to cover concurrent allocation
> + * transactions when we initially hit enospc. These each require a 4
> + * block reservation. Hence by default we cover roughly 2000 concurrent
> + * allocation reservations.
> */
> resblks = mp->m_sb.sb_dblocks;
> do_div(resblks, 20);
> - resblks = min_t(__uint64_t, resblks, 1024);
> + resblks = min_t(__uint64_t, resblks, 8192);
> return resblks;
> }
>
> @@ -1417,6 +1419,9 @@ xfs_mountfs(
> * when at ENOSPC. This is needed for operations like create with
> * attr, unwritten extent conversion at ENOSPC, etc. Data allocations
> * are not allowed to use this reserved space.
> + *
> + * This may drive us straight to ENOSPC on mount, but that implies
> + * we were already there on the last unmount. Warn if this occurs.
> */
> if (!(mp->m_flags & XFS_MOUNT_RDONLY)) {
> resblks = xfs_default_resblks(mp);
> @@ -1725,26 +1730,30 @@ xfs_mod_incore_sb_unlocked(
> lcounter += rem;
> }
> } else { /* Taking blocks away */
> -
> lcounter += delta;
> + if (lcounter >= 0) {
> + mp->m_sb.sb_fdblocks = lcounter +
> + XFS_ALLOC_SET_ASIDE(mp);
> + return 0;
> + }
>
> - /*
> - * If were out of blocks, use any available reserved blocks if
> - * were allowed to.
> - */
I was just looking at this code yesterday, and got confused
by the indentation of this comment. You beat me to fixing it.
I also think your rearranging of the logic below is an improvement.
> + /*
> + * We are out of blocks, use any available reserved
> + * blocks if were allowed to.
> + */
> + if (!rsvd)
> + return XFS_ERROR(ENOSPC);
>
> - if (lcounter < 0) {
> - if (rsvd) {
> - lcounter = (long long)mp->m_resblks_avail + delta;
> - if (lcounter < 0) {
> - return XFS_ERROR(ENOSPC);
> - }
> - mp->m_resblks_avail = lcounter;
> - return 0;
> - } else { /* not reserved */
> - return XFS_ERROR(ENOSPC);
> - }
> + lcounter = (long long)mp->m_resblks_avail + delta;
> + if (lcounter >= 0) {
> + mp->m_resblks_avail = lcounter;
> + return 0;
> }
> + printk_once(KERN_WARNING
> + "Filesystem \"%s\": reserve blocks depleted! "
> + "Consider increasing reserve pool size.",
> + mp->m_fsname);
> + return XFS_ERROR(ENOSPC);
> }
>
> mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp);
More information about the xfs
mailing list