From: Brian Behlendorf Date: Tue, 23 Jul 2013 22:52:11 +0000 (-0700) Subject: Return -1 for generic kmem cache shrinker X-Git-Tag: zfs-0.8.0-rc1~152^2~268 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b9b3715;p=zfs Return -1 for generic kmem cache shrinker 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 Signed-off-by: Richard Yao Closes zfsonlinux/zfs#1276 Closes zfsonlinux/zfs#1598 Closes zfsonlinux/zfs#1432 --- diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c index 8547fa74f..9e1b0db0f 100644 --- a/module/spl/spl-kmem.c +++ b/module/spl/spl-kmem.c @@ -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);