diff options
| author | Suren Baghdasaryan <surenb@google.com> | 2017-12-05 13:34:17 -0800 |
|---|---|---|
| committer | Michael Bestas <mkbestas@lineageos.org> | 2019-12-23 23:43:31 +0200 |
| commit | c4da12244f0b3cb8487fa68665a32bd0457efed0 (patch) | |
| tree | efe612f4c0e69353479205c3bf598a17f7172864 | |
| parent | d703ac40bf7b60eb751766785246aa68ebc7c473 (diff) | |
msm: kgsl: Stop slab shrinker when no more pages can be reclaimed
do_shrink_slab() scans each shrinker in batches of at most
batch_size (128) pages at a time until total_scan pages are
scanned or until shrinker returns SHRINK_STOP. Under heavy
memory pressure total_scan can be large (in thousands) and
kgsl_pool_shrink_scan_objects() ends up returning 0 after
all pages that were reclaimable are reclaimed. This results in
multiple calls to kgsl_pool_shrink_scan_objects() that do not
reclaim any memory. To prevent this kgsl_pool_shrink_scan_objects()
is modified to return SHRINK_STOP as soon as no more memory can
be reclaimed.
Bug: 69931996
Test: tested using alloc-stress with additional traces
Change-Id: Ia48fc2c0d888c54ec9642c0b0962a70ca3cb4c5e
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
| -rw-r--r-- | drivers/gpu/msm/kgsl_pool.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/gpu/msm/kgsl_pool.c b/drivers/gpu/msm/kgsl_pool.c index 5da8c1dcf5c1..cd5f8e3efe98 100644 --- a/drivers/gpu/msm/kgsl_pool.c +++ b/drivers/gpu/msm/kgsl_pool.c @@ -467,12 +467,16 @@ kgsl_pool_shrink_scan_objects(struct shrinker *shrinker, /* nr represents number of pages to be removed*/ int nr = sc->nr_to_scan; int total_pages = kgsl_pool_size_total(); + unsigned long ret; /* Target pages represents new pool size */ int target_pages = (nr > total_pages) ? 0 : (total_pages - nr); /* Reduce pool size to target_pages */ - return kgsl_pool_reduce(target_pages, false); + ret = kgsl_pool_reduce(target_pages, false); + + /* If we are unable to shrink more, stop trying */ + return (ret == 0) ? SHRINK_STOP : ret; } static unsigned long |
