diff --git a/mm/vmscan.c b/mm/vmscan.c index 667e713174a3..35755b8351cc 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -471,6 +471,10 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl, long batch_size = shrinker->batch ? shrinker->batch : SHRINK_BATCH; long scanned = 0, next_deferred; + long min_cache_size = batch_size; + + if (current_is_kswapd()) + min_cache_size = 0; if (!(shrinker->flags & SHRINKER_NUMA_AWARE)) nid = 0; @@ -550,7 +554,7 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl, * scanning at high prio and therefore should try to reclaim as much as * possible. */ - while (total_scan >= batch_size || + while (total_scan > min_cache_size || total_scan >= freeable) { unsigned long ret; unsigned long nr_to_scan = min(batch_size, total_scan);