|
@@ -247,14 +247,18 @@ unsigned long shrink_slab(struct shrink_control *shrink,
|
|
|
|
|
|
list_for_each_entry(shrinker, &shrinker_list, list) {
|
|
|
unsigned long long delta;
|
|
|
- unsigned long total_scan;
|
|
|
- unsigned long max_pass;
|
|
|
+ long total_scan;
|
|
|
+ long max_pass;
|
|
|
int shrink_ret = 0;
|
|
|
long nr;
|
|
|
long new_nr;
|
|
|
long batch_size = shrinker->batch ? shrinker->batch
|
|
|
: SHRINK_BATCH;
|
|
|
|
|
|
+ max_pass = do_shrinker_shrink(shrinker, shrink, 0);
|
|
|
+ if (max_pass <= 0)
|
|
|
+ continue;
|
|
|
+
|
|
|
/*
|
|
|
* copy the current shrinker scan count into a local variable
|
|
|
* and zero it so that other concurrent shrinker invocations
|
|
@@ -265,7 +269,6 @@ unsigned long shrink_slab(struct shrink_control *shrink,
|
|
|
} while (cmpxchg(&shrinker->nr, nr, 0) != nr);
|
|
|
|
|
|
total_scan = nr;
|
|
|
- max_pass = do_shrinker_shrink(shrinker, shrink, 0);
|
|
|
delta = (4 * nr_pages_scanned) / shrinker->seeks;
|
|
|
delta *= max_pass;
|
|
|
do_div(delta, lru_pages + 1);
|