From b9b3715346b2748b2e512099862f1eabf076cf51 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Tue, 23 Jul 2013 15:52:11 -0700 Subject: [PATCH] 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 --- module/spl/spl-kmem.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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); -- 2.40.0