diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 2aa3cb760189..8199e1b9a204 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -456,8 +456,8 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl, | |||
456 | long scanned = 0, next_deferred; | 456 | long scanned = 0, next_deferred; |
457 | 457 | ||
458 | freeable = shrinker->count_objects(shrinker, shrinkctl); | 458 | freeable = shrinker->count_objects(shrinker, shrinkctl); |
459 | if (freeable == 0) | 459 | if (freeable == 0 || freeable == SHRINK_EMPTY) |
460 | return 0; | 460 | return freeable; |
461 | 461 | ||
462 | /* | 462 | /* |
463 | * copy the current shrinker scan count into a local variable | 463 | * copy the current shrinker scan count into a local variable |
@@ -596,6 +596,8 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, | |||
596 | continue; | 596 | continue; |
597 | 597 | ||
598 | ret = do_shrink_slab(&sc, shrinker, priority); | 598 | ret = do_shrink_slab(&sc, shrinker, priority); |
599 | if (ret == SHRINK_EMPTY) | ||
600 | ret = 0; | ||
599 | freed += ret; | 601 | freed += ret; |
600 | 602 | ||
601 | if (rwsem_is_contended(&shrinker_rwsem)) { | 603 | if (rwsem_is_contended(&shrinker_rwsem)) { |
@@ -641,6 +643,7 @@ static unsigned long shrink_slab(gfp_t gfp_mask, int nid, | |||
641 | { | 643 | { |
642 | struct shrinker *shrinker; | 644 | struct shrinker *shrinker; |
643 | unsigned long freed = 0; | 645 | unsigned long freed = 0; |
646 | int ret; | ||
644 | 647 | ||
645 | if (!mem_cgroup_is_root(memcg)) | 648 | if (!mem_cgroup_is_root(memcg)) |
646 | return shrink_slab_memcg(gfp_mask, nid, memcg, priority); | 649 | return shrink_slab_memcg(gfp_mask, nid, memcg, priority); |
@@ -658,7 +661,10 @@ static unsigned long shrink_slab(gfp_t gfp_mask, int nid, | |||
658 | if (!(shrinker->flags & SHRINKER_NUMA_AWARE)) | 661 | if (!(shrinker->flags & SHRINKER_NUMA_AWARE)) |
659 | sc.nid = 0; | 662 | sc.nid = 0; |
660 | 663 | ||
661 | freed += do_shrink_slab(&sc, shrinker, priority); | 664 | ret = do_shrink_slab(&sc, shrinker, priority); |
665 | if (ret == SHRINK_EMPTY) | ||
666 | ret = 0; | ||
667 | freed += ret; | ||
662 | /* | 668 | /* |
663 | * Bail out if someone want to register a new shrinker to | 669 | * Bail out if someone want to register a new shrinker to |
664 | * prevent the regsitration from being stalled for long periods | 670 | * prevent the regsitration from being stalled for long periods |