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

Commit 7fb9ee5d authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Simplify guard logic for setup_scratch_page()



Older gcc is complaining it can't follow the guards and thinks that
addr may be used uninitialised

In the process, we can simplify down to one loop,
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-131 (-131)
Function                                     old     new   delta
setup_scratch_page                           545     414    -131

Reported-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180129102840.19901-1-chris@chris-wilson.co.uk
parent 74c0167f
Loading
Loading
Loading
Loading
+33 −36
Original line number Diff line number Diff line
@@ -543,9 +543,7 @@ static void fill_page_dma_32(struct i915_address_space *vm,
static int
setup_scratch_page(struct i915_address_space *vm, gfp_t gfp)
{
	struct page *page = NULL;
	dma_addr_t addr;
	int order;
	unsigned long size;

	/*
	 * In order to utilize 64K pages for an object with a size < 2M, we will
@@ -559,48 +557,47 @@ setup_scratch_page(struct i915_address_space *vm, gfp_t gfp)
	 * TODO: we should really consider write-protecting the scratch-page and
	 * sharing between ppgtt
	 */
	size = I915_GTT_PAGE_SIZE_4K;
	if (i915_vm_is_48bit(vm) &&
	    HAS_PAGE_SIZES(vm->i915, I915_GTT_PAGE_SIZE_64K)) {
		order = get_order(I915_GTT_PAGE_SIZE_64K);
		page = alloc_pages(gfp | __GFP_ZERO | __GFP_NOWARN, order);
		if (page) {
			addr = dma_map_page(vm->dma, page, 0,
					    I915_GTT_PAGE_SIZE_64K,
					    PCI_DMA_BIDIRECTIONAL);
			if (unlikely(dma_mapping_error(vm->dma, addr))) {
				__free_pages(page, order);
				page = NULL;
		size = I915_GTT_PAGE_SIZE_64K;
		gfp |= __GFP_NOWARN;
	}
	gfp |= __GFP_ZERO | __GFP_RETRY_MAYFAIL;

			if (!IS_ALIGNED(addr, I915_GTT_PAGE_SIZE_64K)) {
				dma_unmap_page(vm->dma, addr,
					       I915_GTT_PAGE_SIZE_64K,
					       PCI_DMA_BIDIRECTIONAL);
				__free_pages(page, order);
				page = NULL;
			}
		}
	}
	do {
		int order = get_order(size);
		struct page *page;
		dma_addr_t addr;

	if (!page) {
		order = 0;
		page = alloc_page(gfp | __GFP_ZERO);
		page = alloc_pages(gfp, order);
		if (unlikely(!page))
			return -ENOMEM;
			goto skip;

		addr = dma_map_page(vm->dma, page, 0, PAGE_SIZE,
		addr = dma_map_page(vm->dma, page, 0, size,
				    PCI_DMA_BIDIRECTIONAL);
		if (unlikely(dma_mapping_error(vm->dma, addr))) {
			__free_page(page);
			return -ENOMEM;
		}
	}
		if (unlikely(dma_mapping_error(vm->dma, addr)))
			goto free_page;

		if (unlikely(!IS_ALIGNED(addr, size)))
			goto unmap_page;

		vm->scratch_page.page = page;
		vm->scratch_page.daddr = addr;
		vm->scratch_page.order = order;

		return 0;

unmap_page:
		dma_unmap_page(vm->dma, addr, size, PCI_DMA_BIDIRECTIONAL);
free_page:
		__free_pages(page, order);
skip:
		if (size == I915_GTT_PAGE_SIZE_4K)
			return -ENOMEM;

		size = I915_GTT_PAGE_SIZE_4K;
		gfp &= ~__GFP_NOWARN;
	} while (1);
}

static void cleanup_scratch_page(struct i915_address_space *vm)