diff options
author | Dave Chinner <dchinner@redhat.com> | 2011-07-08 14:14:37 +1000 |
---|---|---|
committer | Ziyan <jaraidaniel@gmail.com> | 2016-03-11 15:56:56 +0100 |
commit | cf6b8a951a58ce898eaee284f7fd6e51335a1eea (patch) | |
tree | c965ff3b395c27cd7f18bc7c2f5a95080f109a51 /mm | |
parent | e41f7cdae524b549884a11c4b8a16ae6e3a73f2f (diff) | |
download | kernel_samsung_espresso10-cf6b8a951a58ce898eaee284f7fd6e51335a1eea.zip kernel_samsung_espresso10-cf6b8a951a58ce898eaee284f7fd6e51335a1eea.tar.gz kernel_samsung_espresso10-cf6b8a951a58ce898eaee284f7fd6e51335a1eea.tar.bz2 |
vmscan: add customisable shrinker batch size
For shrinkers that have their own cond_resched* calls, having
shrink_slab break the work down into small batches is not
paticularly efficient. Add a custom batchsize field to the struct
shrinker so that shrinkers can use a larger batch size if they
desire.
A value of zero (uninitialised) means "use the default", so
behaviour is unchanged by this patch.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Conflicts:
mm/vmscan.c
Diffstat (limited to 'mm')
-rw-r--r-- | mm/vmscan.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 2174733..a22c99f 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -253,6 +253,8 @@ unsigned long shrink_slab(struct shrink_control *shrink, 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) @@ -306,19 +308,19 @@ unsigned long shrink_slab(struct shrink_control *shrink, nr_pages_scanned, lru_pages, max_pass, delta, total_scan); - while (total_scan >= SHRINK_BATCH) { - long this_scan = SHRINK_BATCH; + while (total_scan >= batch_size) { + int shrink_ret; int nr_before; nr_before = do_shrinker_shrink(shrinker, shrink, 0); shrink_ret = do_shrinker_shrink(shrinker, shrink, - this_scan); + batch_size); if (shrink_ret == -1) break; if (shrink_ret < nr_before) ret += nr_before - shrink_ret; - count_vm_events(SLABS_SCANNED, this_scan); - total_scan -= this_scan; + count_vm_events(SLABS_SCANNED, batch_size); + total_scan -= batch_size; cond_resched(); } |