Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba96a2ee authored by Rebecca Schultz Zavin's avatar Rebecca Schultz Zavin Committed by Greg Kroah-Hartman
Browse files

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: default avatarRebecca Schultz Zavin <rebecca@android.com>
[jstultz: modified patch to apply to staging directory]
Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 13ba7805
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -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++;
	}