diff options
author | Sidath Senanayake <sidaths@google.com> | 2018-07-31 15:28:14 +0200 |
---|---|---|
committer | Sidath Senanayake <sidaths@google.com> | 2018-07-31 15:28:14 +0200 |
commit | f32af5a9ba3c2b556d92827a96dbeec3df200968 (patch) | |
tree | f408feaf7cd8b87a980575c132f11d3ba45a3f8d /mali_kbase/mali_kbase_mem_pool.c | |
parent | 5574d60cda52fa08ca2cc714ae051ee2b6f850d7 (diff) | |
download | gpu-f32af5a9ba3c2b556d92827a96dbeec3df200968.tar.gz |
Mali Bifrost DDK r14p0 KMD
Provenance:
37fe8262c (collaborate/EAC/b_r14p0)
BX304L01B-BU-00000-r14p0-01rel0
BX304L06A-BU-00000-r14p0-01rel0
BX304X07X-BU-00000-r14p0-01rel0
Signed-off-by: Sidath Senanayake <sidaths@google.com>
Change-Id: I0eb3b666045d72d33e2953954de5b416f909da0f
Diffstat (limited to 'mali_kbase/mali_kbase_mem_pool.c')
-rw-r--r-- | mali_kbase/mali_kbase_mem_pool.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/mali_kbase/mali_kbase_mem_pool.c b/mali_kbase/mali_kbase_mem_pool.c index 1255df0..0f91be1 100644 --- a/mali_kbase/mali_kbase_mem_pool.c +++ b/mali_kbase/mali_kbase_mem_pool.c @@ -1,6 +1,6 @@ /* * - * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2015-2018 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software @@ -414,9 +414,10 @@ void kbase_mem_pool_mark_dying(struct kbase_mem_pool *pool) void kbase_mem_pool_term(struct kbase_mem_pool *pool) { struct kbase_mem_pool *next_pool = pool->next_pool; - struct page *p; + struct page *p, *tmp; size_t nr_to_spill = 0; LIST_HEAD(spill_list); + LIST_HEAD(free_list); int i; pool_dbg(pool, "terminate()\n"); @@ -434,7 +435,6 @@ void kbase_mem_pool_term(struct kbase_mem_pool *pool) /* Zero pages first without holding the next_pool lock */ for (i = 0; i < nr_to_spill; i++) { p = kbase_mem_pool_remove_locked(pool); - kbase_mem_pool_zero_page(pool, p); list_add(&p->lru, &spill_list); } } @@ -442,18 +442,26 @@ void kbase_mem_pool_term(struct kbase_mem_pool *pool) while (!kbase_mem_pool_is_empty(pool)) { /* Free remaining pages to kernel */ p = kbase_mem_pool_remove_locked(pool); - kbase_mem_pool_free_page(pool, p); + list_add(&p->lru, &free_list); } kbase_mem_pool_unlock(pool); if (next_pool && nr_to_spill) { + list_for_each_entry(p, &spill_list, lru) + kbase_mem_pool_zero_page(pool, p); + /* Add new page list to next_pool */ kbase_mem_pool_add_list(next_pool, &spill_list, nr_to_spill); pool_dbg(pool, "terminate() spilled %zu pages\n", nr_to_spill); } + list_for_each_entry_safe(p, tmp, &free_list, lru) { + list_del_init(&p->lru); + kbase_mem_pool_free_page(pool, p); + } + pool_dbg(pool, "terminated\n"); } @@ -678,7 +686,7 @@ static void kbase_mem_pool_add_array(struct kbase_mem_pool *pool, continue; if (is_huge_head(pages[i]) || !is_huge(pages[i])) { - p = phys_to_page(as_phys_addr_t(pages[i])); + p = as_page(pages[i]); if (zero) kbase_mem_pool_zero_page(pool, p); else if (sync) @@ -720,7 +728,7 @@ static void kbase_mem_pool_add_array_locked(struct kbase_mem_pool *pool, continue; if (is_huge_head(pages[i]) || !is_huge(pages[i])) { - p = phys_to_page(as_phys_addr_t(pages[i])); + p = as_page(pages[i]); if (zero) kbase_mem_pool_zero_page(pool, p); else if (sync) @@ -780,7 +788,7 @@ void kbase_mem_pool_free_pages(struct kbase_mem_pool *pool, size_t nr_pages, continue; } - p = phys_to_page(as_phys_addr_t(pages[i])); + p = as_page(pages[i]); kbase_mem_pool_free_page(pool, p); pages[i] = as_tagged(0); @@ -824,7 +832,7 @@ void kbase_mem_pool_free_pages_locked(struct kbase_mem_pool *pool, continue; } - p = phys_to_page(as_phys_addr_t(pages[i])); + p = as_page(pages[i]); kbase_mem_pool_free_page(pool, p); pages[i] = as_tagged(0); |