From b6ce9976eb9ca20d1927df9963ae9af9520413e0 Mon Sep 17 00:00:00 2001 From: Cho KyongHo Date: Wed, 26 Dec 2018 15:17:13 +0900 Subject: [PATCH] [RAMEN9610-9924] android: ion: add limit to page pool of systemheap Users may want to restrict the number of free pages in the page pool because it causes memory profiling and tuning hard. Change-Id: I154ffa5eb176b0dc2bad0b3eb5c5747cde3a0bd5 Signed-off-by: Cho KyongHo --- drivers/staging/android/ion/ion.h | 1 + drivers/staging/android/ion/ion_page_pool.c | 2 +- drivers/staging/android/ion/ion_system_heap.c | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/staging/android/ion/ion.h b/drivers/staging/android/ion/ion.h index cd34c9cecc6c..f439413a80ec 100644 --- a/drivers/staging/android/ion/ion.h +++ b/drivers/staging/android/ion/ion.h @@ -348,6 +348,7 @@ struct ion_page_pool *ion_page_pool_create(gfp_t gfp_mask, unsigned int order, void ion_page_pool_destroy(struct ion_page_pool *pool); struct page *ion_page_pool_alloc(struct ion_page_pool *pool, bool nozero); void ion_page_pool_free(struct ion_page_pool *pool, struct page *page); +int ion_page_pool_total(struct ion_page_pool *pool, bool high); /** ion_page_pool_shrink - shrinks the size of the memory cached in the pool * @pool: the pool diff --git a/drivers/staging/android/ion/ion_page_pool.c b/drivers/staging/android/ion/ion_page_pool.c index 75997d653fab..68e7efd3717d 100644 --- a/drivers/staging/android/ion/ion_page_pool.c +++ b/drivers/staging/android/ion/ion_page_pool.c @@ -117,7 +117,7 @@ void ion_page_pool_free(struct ion_page_pool *pool, struct page *page) ion_page_pool_free_pages(pool, page); } -static int ion_page_pool_total(struct ion_page_pool *pool, bool high) +int ion_page_pool_total(struct ion_page_pool *pool, bool high) { int count = pool->low_count; diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c index 7caad6ee5fc6..097648b634c8 100644 --- a/drivers/staging/android/ion/ion_system_heap.c +++ b/drivers/staging/android/ion/ion_system_heap.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "ion.h" #define NUM_ORDERS ARRAY_SIZE(orders) @@ -183,6 +184,9 @@ free_pages: return -ENOMEM; } +static int max_page_pool_size = INT_MAX; +module_param(max_page_pool_size, int, 0600); + static void ion_system_heap_free(struct ion_buffer *buffer) { struct ion_system_heap *sys_heap = container_of(buffer->heap, @@ -190,8 +194,17 @@ static void ion_system_heap_free(struct ion_buffer *buffer) heap); struct sg_table *table = buffer->sg_table; struct scatterlist *sg; + unsigned int count = 0; int i; + for (i = 0; i < NUM_ORDERS; i++) { + count += ion_page_pool_total(sys_heap->cached_pools[i], true); + count += ion_page_pool_total(sys_heap->uncached_pools[i], true); + } + + if (count > max_page_pool_size) + buffer->private_flags |= ION_PRIV_FLAG_SHRINKER_FREE; + /* zero the buffer before goto page pool */ if (!(buffer->private_flags & ION_PRIV_FLAG_SHRINKER_FREE)) ion_heap_buffer_zero(buffer); -- 2.20.1