|
@@ -456,8 +456,8 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl,
|
|
|
long scanned = 0, next_deferred;
|
|
|
|
|
|
freeable = shrinker->count_objects(shrinker, shrinkctl);
|
|
|
- if (freeable == 0)
|
|
|
- return 0;
|
|
|
+ if (freeable == 0 || freeable == SHRINK_EMPTY)
|
|
|
+ return freeable;
|
|
|
|
|
|
/*
|
|
|
* 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,
|
|
|
continue;
|
|
|
|
|
|
ret = do_shrink_slab(&sc, shrinker, priority);
|
|
|
+ if (ret == SHRINK_EMPTY)
|
|
|
+ ret = 0;
|
|
|
freed += ret;
|
|
|
|
|
|
if (rwsem_is_contended(&shrinker_rwsem)) {
|
|
@@ -641,6 +643,7 @@ static unsigned long shrink_slab(gfp_t gfp_mask, int nid,
|
|
|
{
|
|
|
struct shrinker *shrinker;
|
|
|
unsigned long freed = 0;
|
|
|
+ int ret;
|
|
|
|
|
|
if (!mem_cgroup_is_root(memcg))
|
|
|
return shrink_slab_memcg(gfp_mask, nid, memcg, priority);
|
|
@@ -658,7 +661,10 @@ static unsigned long shrink_slab(gfp_t gfp_mask, int nid,
|
|
|
if (!(shrinker->flags & SHRINKER_NUMA_AWARE))
|
|
|
sc.nid = 0;
|
|
|
|
|
|
- freed += do_shrink_slab(&sc, shrinker, priority);
|
|
|
+ ret = do_shrink_slab(&sc, shrinker, priority);
|
|
|
+ if (ret == SHRINK_EMPTY)
|
|
|
+ ret = 0;
|
|
|
+ freed += ret;
|
|
|
/*
|
|
|
* Bail out if someone want to register a new shrinker to
|
|
|
* prevent the regsitration from being stalled for long periods
|