From ba96a2eed5d357c4107f04d8c9f32a58c9ed01da Mon Sep 17 00:00:00 2001 From: Rebecca Schultz Zavin Date: Fri, 13 Dec 2013 14:24:07 -0800 Subject: [PATCH] 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. Signed-off-by: Rebecca Schultz Zavin [jstultz: modified patch to apply to staging directory] Signed-off-by: John Stultz Signed-off-by: Greg Kroah-Hartman --- drivers/staging/android/ion/ion_system_heap.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c index ef8afc7e4e72..30a225a92c40 100644 --- a/drivers/staging/android/ion/ion_system_heap.c +++ b/drivers/staging/android/ion/ion_system_heap.c @@ -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++; } -- 2.20.1