]> git.proxmox.com Git - mirror_spl.git/commitdiff
Return -1 for generic kmem cache shrinker
authorBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 23 Jul 2013 22:52:11 +0000 (15:52 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 30 Jul 2013 22:33:24 +0000 (15:33 -0700)
It has been observed that it's possible to get in a state where
shrink_slabs() will spin repeated invoking the generic kmem cache
shrinker.  It fails to detect it's not making forward progress
reclaiming from the cache and doesn't give up.  To ensure this
never occurs we unconditionally return -1 after reclaiming what
we can.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Richard Yao <ryao@gentoo.org>
Closes zfsonlinux/zfs#1276
Closes zfsonlinux/zfs#1598
Closes zfsonlinux/zfs#1432

module/spl/spl-kmem.c

index 8547fa74fa5a70986d37a0e56a43f8a7eddf0dc1..9e1b0db0fc2e4a791c75eeff334618dedb123188 100644 (file)
@@ -2122,7 +2122,15 @@ __spl_kmem_cache_generic_shrinker(struct shrinker *shrink,
        }
        up_read(&spl_kmem_cache_sem);
 
-       return (unused * sysctl_vfs_cache_pressure) / 100;
+       /*
+        * After performing reclaim always return -1 to indicate we cannot
+        * perform additional reclaim.  This prevents shrink_slabs() from
+        * repeatedly invoking this generic shrinker and potentially spinning.
+        */
+       if (sc->nr_to_scan)
+               return -1;
+
+       return unused;
 }
 
 SPL_SHRINKER_CALLBACK_WRAPPER(spl_kmem_cache_generic_shrinker);