From 9232778c98af5ff85caca9e5cd37b963fb3196d5 Mon Sep 17 00:00:00 2001 From: Sidath Senanayake Date: Wed, 9 Nov 2016 14:53:08 +0100 Subject: Mali Bifrost DDK r2p0 KMD Provenance: 6aec14e96 (collaborate/EAC/b_r2p0) BX304L01B-BU-00000-r2p0-03rel0 BX304L06A-BU-00000-r2p0-03rel0 BX304X07X-BU-00000-r2p0-03bet0 Signed-off-by: Sidath Senanayake Change-Id: Ic7007d25551bd1478b491ec5a0fc9ecb400aa25d --- mali_kbase/mali_kbase_mem_pool.c | 47 +++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 27 deletions(-) (limited to 'mali_kbase/mali_kbase_mem_pool.c') diff --git a/mali_kbase/mali_kbase_mem_pool.c b/mali_kbase/mali_kbase_mem_pool.c index 9570618..9a3f9b5 100644 --- a/mali_kbase/mali_kbase_mem_pool.c +++ b/mali_kbase/mali_kbase_mem_pool.c @@ -175,11 +175,11 @@ static void kbase_mem_pool_spill(struct kbase_mem_pool *next_pool, kbase_mem_pool_add(next_pool, p); } -static struct page *kbase_mem_pool_alloc_page(struct kbase_mem_pool *pool) +struct page *kbase_mem_alloc_page(struct kbase_device *kbdev) { struct page *p; gfp_t gfp; - struct device *dev = pool->kbdev->dev; + struct device *dev = kbdev->dev; dma_addr_t dma_addr; #if defined(CONFIG_ARM) && !defined(CONFIG_HAVE_DMA_ATTRS) && \ @@ -210,8 +210,6 @@ static struct page *kbase_mem_pool_alloc_page(struct kbase_mem_pool *pool) kbase_set_dma_addr(p, dma_addr); - pool_dbg(pool, "alloced page from kernel\n"); - return p; } @@ -256,36 +254,35 @@ static size_t kbase_mem_pool_shrink(struct kbase_mem_pool *pool, return nr_freed; } -static size_t kbase_mem_pool_grow(struct kbase_mem_pool *pool, +int kbase_mem_pool_grow(struct kbase_mem_pool *pool, size_t nr_to_grow) { struct page *p; size_t i; - for (i = 0; i < nr_to_grow && !kbase_mem_pool_is_full(pool); i++) { - p = kbase_mem_pool_alloc_page(pool); + for (i = 0; i < nr_to_grow; i++) { + p = kbase_mem_alloc_page(pool->kbdev); if (!p) - break; + return -ENOMEM; kbase_mem_pool_add(pool, p); } - return i; + return 0; } -size_t kbase_mem_pool_trim(struct kbase_mem_pool *pool, size_t new_size) +void kbase_mem_pool_trim(struct kbase_mem_pool *pool, size_t new_size) { size_t cur_size; cur_size = kbase_mem_pool_size(pool); + if (new_size > pool->max_size) + new_size = pool->max_size; + if (new_size < cur_size) kbase_mem_pool_shrink(pool, cur_size - new_size); else if (new_size > cur_size) kbase_mem_pool_grow(pool, new_size - cur_size); - - cur_size = kbase_mem_pool_size(pool); - - return cur_size; } void kbase_mem_pool_set_max_size(struct kbase_mem_pool *pool, size_t max_size) @@ -428,21 +425,17 @@ struct page *kbase_mem_pool_alloc(struct kbase_mem_pool *pool) { struct page *p; - pool_dbg(pool, "alloc()\n"); - - p = kbase_mem_pool_remove(pool); + do { + pool_dbg(pool, "alloc()\n"); + p = kbase_mem_pool_remove(pool); - if (!p && pool->next_pool) { - /* Allocate via next pool */ - return kbase_mem_pool_alloc(pool->next_pool); - } + if (p) + return p; - if (!p) { - /* Get page from kernel */ - p = kbase_mem_pool_alloc_page(pool); - } + pool = pool->next_pool; + } while (pool); - return p; + return NULL; } void kbase_mem_pool_free(struct kbase_mem_pool *pool, struct page *p, @@ -499,7 +492,7 @@ int kbase_mem_pool_alloc_pages(struct kbase_mem_pool *pool, size_t nr_pages, /* Get any remaining pages from kernel */ for (; i < nr_pages; i++) { - p = kbase_mem_pool_alloc_page(pool); + p = kbase_mem_alloc_page(pool->kbdev); if (!p) goto err_rollback; pages[i] = page_to_phys(p); -- cgit v1.2.3