summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-09-12 21:29:44 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-09-12 21:29:43 -0700
commit88701f0bc993f4d6ccbe47a6b1ec98b423bb9761 (patch)
tree0a27551e1dfa65420f44192dc665c9f37db52335
parentb7bf6d2b634c0806a584e25d69e7b69b1d5781d4 (diff)
parent91f43fc75de619e2cd0c135d1151474d25366f94 (diff)
Merge "msm: kgsl: Change the shrinker to not free reserved pages"
-rw-r--r--drivers/gpu/msm/kgsl_pool.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/gpu/msm/kgsl_pool.c b/drivers/gpu/msm/kgsl_pool.c
index 7967b19779db..f5402fdc7e57 100644
--- a/drivers/gpu/msm/kgsl_pool.c
+++ b/drivers/gpu/msm/kgsl_pool.c
@@ -197,7 +197,7 @@ _kgsl_pool_shrink(struct kgsl_page_pool *pool, int num_pages)
* starting from higher order pool.
*/
static unsigned long
-kgsl_pool_reduce(unsigned int target_pages)
+kgsl_pool_reduce(unsigned int target_pages, bool exit)
{
int total_pages = 0;
int i;
@@ -210,6 +210,14 @@ kgsl_pool_reduce(unsigned int target_pages)
for (i = (KGSL_NUM_POOLS - 1); i >= 0; i--) {
pool = &kgsl_pools[i];
+ /*
+ * Only reduce the pool sizes for pools which are allowed to
+ * allocate memory unless we are at close, in which case the
+ * reserved memory for all pools needs to be freed
+ */
+ if (!pool->allocation_allowed && !exit)
+ continue;
+
total_pages -= pcount;
nr_removed = total_pages - target_pages;
@@ -418,7 +426,7 @@ kgsl_pool_shrink_scan_objects(struct shrinker *shrinker,
int target_pages = (nr > total_pages) ? 0 : (total_pages - nr);
/* Reduce pool size to target_pages */
- return kgsl_pool_reduce(target_pages);
+ return kgsl_pool_reduce(target_pages, false);
}
static unsigned long
@@ -449,7 +457,7 @@ void kgsl_init_page_pools(void)
void kgsl_exit_page_pools(void)
{
/* Release all pages in pools, if any.*/
- kgsl_pool_reduce(0);
+ kgsl_pool_reduce(0, true);
/* Unregister shrinker */
unregister_shrinker(&kgsl_pool_shrinker);