vfs: increase shrinker batch size
authorDave Chinner <dchinner@redhat.com>
Fri, 8 Jul 2011 04:14:45 +0000 (14:14 +1000)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 21 Jul 2011 00:47:41 +0000 (20:47 -0400)
Now that the per-sb shrinker is responsible for shrinking 2 or more
caches, increase the batch size to keep econmies of scale for
shrinking each cache.  Increase the shrinker batch size to 1024
objects.

To allow for a large increase in batch size, add a conditional
reschedule to prune_icache_sb() so that we don't hold the LRU spin
lock for too long. This mirrors the behaviour of the
__shrink_dcache_sb(), and allows us to increase the batch size
without needing to worry about problems caused by long lock hold
times.

To ensure that filesystems using the per-sb shrinker callouts don't
cause problems, document that the object freeing method must
reschedule appropriately inside loops.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Documentation/filesystems/vfs.txt
fs/super.c

index fd24f34f120f6adea5af1a9148d4a0d66cf2cc2f..6bf85b78cfea8d00c70df6c76e3bde11b88b98c7 100644 (file)
@@ -317,6 +317,12 @@ or bottom half).
        the VM is trying to reclaim under GFP_NOFS conditions, hence this
        method does not need to handle that situation itself.
 
+       Implementations must include conditional reschedule calls inside any
+       scanning loop that is done. This allows the VFS to determine
+       appropriate scan batch sizes without having to worry about whether
+       implementations will cause holdoff problems due to large scan batch
+       sizes.
+
 Whoever sets up the inode is responsible for filling in the "i_op" field. This
 is a pointer to a "struct inode_operations" which describes the methods that
 can be performed on individual inodes.
index 5101f0544960381bde17accd6629660e73bbaca6..7943f04cb3a92dd32b0ee68893cf2dfc3b3127af 100644 (file)
@@ -182,6 +182,7 @@ static struct super_block *alloc_super(struct file_system_type *type)
 
                s->s_shrink.seeks = DEFAULT_SEEKS;
                s->s_shrink.shrink = prune_super;
+               s->s_shrink.batch = 1024;
        }
 out:
        return s;