xfs
[Top] [All Lists]

[PATCH] Increase the default size of the reserved blocks pool

To: xfs-dev <xfs-dev@xxxxxxx>, xfs-oss <xfs@xxxxxxxxxxx>
Subject: [PATCH] Increase the default size of the reserved blocks pool
From: Lachlan McIlroy <lachlan@xxxxxxx>
Date: Mon, 29 Sep 2008 18:54:13 +1000
Reply-to: lachlan@xxxxxxx
User-agent: Thunderbird 2.0.0.17 (X11/20080914)
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.

--- a/fs/xfs/xfs_mount.c        2008-09-29 18:30:26.000000000 +1000
+++ b/fs/xfs/xfs_mount.c        2008-09-29 18:27:37.000000000 +1000
@@ -1194,7 +1194,7 @@ xfs_mountfs(
         */
        resblks = mp->m_sb.sb_dblocks;
        do_div(resblks, 20);
-       resblks = min_t(__uint64_t, resblks, 1024);
+       resblks = min_t(__uint64_t, resblks, 16384);
        error = xfs_reserve_blocks(mp, &resblks, NULL);
        if (error)
                cmn_err(CE_WARN, "XFS: Unable to allocate reserve blocks. "
@@ -1483,6 +1483,7 @@ xfs_mod_incore_sb_unlocked(
        int             scounter;       /* short counter for 32 bit fields */
        long long       lcounter;       /* long counter for 64 bit fields */
        long long       res_used, rem;
+       static int      depleted = 0;

        /*
         * With the in-core superblock spin lock held, switch
@@ -1535,6 +1536,9 @@ xfs_mod_incore_sb_unlocked(
                                if (rsvd) {
                                        lcounter = (long 
long)mp->m_resblks_avail + delta;
                                        if (lcounter < 0) {
+                                               if ((depleted % 100) == 0)
+                                                       printk(KERN_DEBUG "XFS 
reserved blocks pool depleted.\n");
+                                               depleted++;
                                                return XFS_ERROR(ENOSPC);
                                        }
                                        mp->m_resblks_avail = lcounter;

<Prev in Thread] Current Thread [Next in Thread>