]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Allocate zfs_znode_cache on the Linux slab
authorTim Chase <tim@chase2k.com>
Tue, 14 Apr 2015 05:06:40 +0000 (01:06 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 14 Apr 2015 19:19:22 +0000 (12:19 -0700)
The Linux slab, in general, performs better than the SPl slab in cases
where a lot of objects are allocated and fragmentation is likely present.

This patch fixes pathologically bad behavior in cases where the ARC is
filled with mostly metadata and a user program needs to allocate and
dirty enough memory which would require an insignificant amount of the
ARC to be reclaimed.

If zfs_znode_cache is on the SPL slab, the system may spin for a very
long time trying to reclaim sufficient memory.  If it is on the Linux
slab, the behavior has been observed to be much more predictible; the
memory is reclaimed more efficiently.

Signed-off-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #3283

module/zfs/zfs_znode.c

index c931a72c3aea09177187f4ecaa73112ac0b45fbd..0c0091f0445e27deeeb31a643189c4d6183e3302 100644 (file)
@@ -147,12 +147,14 @@ void
 zfs_znode_init(void)
 {
        /*
-        * Initialize zcache
+        * Initialize zcache.  The KMC_SLAB hint is used in order that it be
+        * backed by kmalloc() when on the Linux slab in order that any
+        * wait_on_bit() operations on the related inode operate properly.
         */
        ASSERT(znode_cache == NULL);
        znode_cache = kmem_cache_create("zfs_znode_cache",
            sizeof (znode_t), 0, zfs_znode_cache_constructor,
-           zfs_znode_cache_destructor, NULL, NULL, NULL, KMC_KMEM);
+           zfs_znode_cache_destructor, NULL, NULL, NULL, KMC_SLAB);
 }
 
 void