diff --git a/mm/page_cache_limit.c b/mm/page_cache_limit.c index 05eb441f2bf215956277a1232a0f044216744b84..34b2f6f699a079376605c3a0dede1d4ac3ece6d6 100644 --- a/mm/page_cache_limit.c +++ b/mm/page_cache_limit.c @@ -18,7 +18,7 @@ static int vm_cache_reclaim_enable = 1; static unsigned long vm_cache_limit_mbytes __read_mostly; static void shrink_shepherd(struct work_struct *w); -static DECLARE_DEFERRABLE_WORK(shepherd, shrink_shepherd); +static DECLARE_DELAYED_WORK(shepherd, shrink_shepherd); static struct work_struct vmscan_works[MAX_NUMNODES]; static bool should_periodical_reclaim(void) @@ -177,9 +177,12 @@ static void shrink_shepherd(struct work_struct *w) if (!should_periodical_reclaim()) return; - for_each_online_node(node) { - if (!work_pending(&vmscan_works[node])) - queue_work_node(node, system_unbound_wq, &vmscan_works[node]); + if (vm_cache_limit_mbytes && page_cache_over_limit()) { + for_each_online_node(node) { + if (!work_pending(&vmscan_works[node])) + queue_work_node(node, system_unbound_wq, + &vmscan_works[node]); + } } queue_delayed_work(system_unbound_wq, &shepherd,