gpu: ion: Stop trying to allocate from an order on first failure

With this patch the system heap will only try to allocate from each
order as long as allocations succeed.  If it failes to obtain a higher
order allocation, it doesn't retry that order.

Change-Id: I0d9144b4c30cc0e427acdcad2f1f12ae7f37f827
Signed-off-by: Rebecca Schultz Zavin <rebecca@android.com>
This commit is contained in:
Rebecca Schultz Zavin
2012-09-25 20:55:27 -07:00
committed by Arve Hjønnevåg
parent d8c1252e23
commit 49cfb6da44

View File

@@ -32,7 +32,8 @@ struct page_info {
};
static struct page_info *alloc_largest_available(unsigned long size,
bool split_pages)
bool split_pages,
unsigned int max_order)
{
static unsigned int orders[] = {8, 4, 0};
struct page *page;
@@ -42,6 +43,8 @@ static struct page_info *alloc_largest_available(unsigned long size,
for (i = 0; i < ARRAY_SIZE(orders); i++) {
if (size < (1 << orders[i]) * PAGE_SIZE)
continue;
if (max_order < orders[i])
continue;
page = alloc_pages(GFP_HIGHUSER | __GFP_ZERO |
__GFP_NOWARN | __GFP_NORETRY, orders[i]);
if (!page)
@@ -71,13 +74,17 @@ static int ion_system_heap_allocate(struct ion_heap *heap,
bool split_pages = ion_buffer_fault_user_mappings(buffer);
unsigned int max_order = orders[0];
INIT_LIST_HEAD(&pages);
while (size_remaining > 0) {
info = alloc_largest_available(size_remaining, split_pages);
info = alloc_largest_available(size_remaining, split_pages,
max_order);
if (!info)
goto err;
list_add_tail(&info->list, &pages);
size_remaining -= (1 << info->order) * PAGE_SIZE;
max_order = info->order;
i++;
}