dma-buf: heaps: rk_system_heap free pages to correct pool

All the pages are freed to the system heap page pools, it is a error for
pages came from the dma32 heap pools.

Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>
Change-Id: I96e50c6b741e6fdbee7e358b939658809059f421
This commit is contained in:
Jianqun Xu
2022-09-14 14:59:41 +08:00
committed by Tao Huang
parent 6148a5867a
commit f78851187e
+8 -10
View File
@@ -45,7 +45,7 @@ struct system_heap_buffer {
int vmap_cnt;
void *vaddr;
struct deferred_freelist_item deferred_free;
struct dmabuf_page_pool **pools;
bool uncached;
};
@@ -457,7 +457,7 @@ static void system_heap_buf_free(struct deferred_freelist_item *item,
if (compound_order(page) == orders[j])
break;
}
dmabuf_page_pool_free(pools[j], page);
dmabuf_page_pool_free(buffer->pools[j], page);
}
}
sg_free_table(table);
@@ -488,15 +488,13 @@ static const struct dma_buf_ops system_heap_buf_ops = {
};
static struct page *system_heap_alloc_largest_available(struct dma_heap *heap,
struct dmabuf_page_pool **pool,
unsigned long size,
unsigned int max_order)
{
struct page *page;
int i;
const char *name = dma_heap_get_name(heap);
struct dmabuf_page_pool **pool;
pool = strstr(name, "dma32") ? dma32_pools : pools;
for (i = 0; i < NUM_ORDERS; i++) {
if (size < (PAGE_SIZE << orders[i]))
continue;
@@ -542,6 +540,7 @@ static struct dma_buf *system_heap_do_allocate(struct dma_heap *heap,
buffer->heap = heap;
buffer->len = len;
buffer->uncached = uncached;
buffer->pools = strstr(dma_heap_get_name(heap), "dma32") ? dma32_pools : pools;
INIT_LIST_HEAD(&pages);
for (i = 0; i < 8; i++)
@@ -555,7 +554,9 @@ static struct dma_buf *system_heap_do_allocate(struct dma_heap *heap,
if (fatal_signal_pending(current))
goto free_buffer;
page = system_heap_alloc_largest_available(heap, size_remaining, max_order);
page = system_heap_alloc_largest_available(heap, buffer->pools,
size_remaining,
max_order);
if (!page)
goto free_buffer;
@@ -658,11 +659,8 @@ static long system_get_pool_size(struct dma_heap *heap)
int i;
long num_pages = 0;
struct dmabuf_page_pool **pool;
const char *name = dma_heap_get_name(heap);
pool = pools;
if (!strcmp(name, "system-dma32") || !strcmp(name, "system-uncached-dma32"))
pool = dma32_pools;
pool = strstr(dma_heap_get_name(heap), "dma32") ? dma32_pools : pools;
for (i = 0; i < NUM_ORDERS; i++, pool++) {
num_pages += ((*pool)->count[POOL_LOWPAGE] +
(*pool)->count[POOL_HIGHPAGE]) << (*pool)->order;