Commit b44d9ce3 authored by Gioh Kim's avatar Gioh Kim Committed by Greg Kroah-Hartman

staging: ion: shrink page-pool by page unit

This patch shrink page-pool by page unit.

The system shrinker calls ion_heap_shrink_count() to get nr_to_scan,
and pass it to ion_heap_shrink_scan().
The problem is the return value of ion_heap_shrink_count() is the number
of pages but ion_system_heap_shrink(), which is called by
ion_heap_shrink_scan(), gets the number of chunk.

The main root of this is that ion_page_pool_shrink() returns page count
via ion_page_pool_total() if it have to check pool size. But it frees
chunks of pages if it have to free pools.

This patch first fix ion_page_pool_shrink() to count only pages,
not chunks. And then ion_system_heap_shrink() to work on pages.
Signed-off-by: default avatarGioh Kim <gioh.kim@lge.com>
Reviewed-by: default avatarLaura Abbott <labbott@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3e3148c5
...@@ -116,7 +116,7 @@ static int ion_page_pool_total(struct ion_page_pool *pool, bool high) ...@@ -116,7 +116,7 @@ static int ion_page_pool_total(struct ion_page_pool *pool, bool high)
int ion_page_pool_shrink(struct ion_page_pool *pool, gfp_t gfp_mask, int ion_page_pool_shrink(struct ion_page_pool *pool, gfp_t gfp_mask,
int nr_to_scan) int nr_to_scan)
{ {
int freed; int freed = 0;
bool high; bool high;
if (current_is_kswapd()) if (current_is_kswapd())
...@@ -127,7 +127,7 @@ int ion_page_pool_shrink(struct ion_page_pool *pool, gfp_t gfp_mask, ...@@ -127,7 +127,7 @@ int ion_page_pool_shrink(struct ion_page_pool *pool, gfp_t gfp_mask,
if (nr_to_scan == 0) if (nr_to_scan == 0)
return ion_page_pool_total(pool, high); return ion_page_pool_total(pool, high);
for (freed = 0; freed < nr_to_scan; freed++) { while (freed < nr_to_scan) {
struct page *page; struct page *page;
mutex_lock(&pool->mutex); mutex_lock(&pool->mutex);
...@@ -141,6 +141,7 @@ int ion_page_pool_shrink(struct ion_page_pool *pool, gfp_t gfp_mask, ...@@ -141,6 +141,7 @@ int ion_page_pool_shrink(struct ion_page_pool *pool, gfp_t gfp_mask,
} }
mutex_unlock(&pool->mutex); mutex_unlock(&pool->mutex);
ion_page_pool_free_pages(pool, page); ion_page_pool_free_pages(pool, page);
freed += (1 << pool->order);
} }
return freed; return freed;
......
...@@ -212,14 +212,26 @@ static int ion_system_heap_shrink(struct ion_heap *heap, gfp_t gfp_mask, ...@@ -212,14 +212,26 @@ static int ion_system_heap_shrink(struct ion_heap *heap, gfp_t gfp_mask,
{ {
struct ion_system_heap *sys_heap; struct ion_system_heap *sys_heap;
int nr_total = 0; int nr_total = 0;
int i; int i, nr_freed;
int only_scan = 0;
sys_heap = container_of(heap, struct ion_system_heap, heap); sys_heap = container_of(heap, struct ion_system_heap, heap);
if (!nr_to_scan)
only_scan = 1;
for (i = 0; i < num_orders; i++) { for (i = 0; i < num_orders; i++) {
struct ion_page_pool *pool = sys_heap->pools[i]; struct ion_page_pool *pool = sys_heap->pools[i];
nr_total += ion_page_pool_shrink(pool, gfp_mask, nr_to_scan); nr_freed = ion_page_pool_shrink(pool, gfp_mask, nr_to_scan);
nr_total += nr_freed;
if (!only_scan) {
nr_to_scan -= nr_freed;
/* shrink completed */
if (nr_to_scan <= 0)
break;
}
} }
return nr_total; return nr_total;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment