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

Commit ad071acb authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter
Browse files

drm/i915: Repeat eviction search after idling the GPU

With the advent of hw context support, we gained some objects that are
pinned for the duration of their request. That is we can make aperture
space available by idling the GPU and in the process performing a
context switch back to the always-pinned default context. As such, we
should not conclude that there is no space in the aperture for the
current object until we have unpinned any such context objects.

Note that we also have the problem of outstanding pageflips preventing
eviction of their framebuffer objects to resolve.

Testcase: igt/gem_ctx_exec/eviction
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=72507


Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Tested-by: default avatarlu hua <huax.lu@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent acc240d4
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ i915_gem_evict_something(struct drm_device *dev, struct i915_address_space *vm,
	} else
		drm_mm_init_scan(&vm->mm, min_size, alignment, cache_level);

search_again:
	/* First see if there is a large enough contiguous idle region... */
	list_for_each_entry(vma, &vm->inactive_list, mm_list) {
		if (mark_free(vma, &unwind_list))
@@ -115,10 +116,17 @@ i915_gem_evict_something(struct drm_device *dev, struct i915_address_space *vm,
		list_del_init(&vma->exec_list);
	}

	/* We expect the caller to unpin, evict all and try again, or give up.
	 * So calling i915_gem_evict_vm() is unnecessary.
	/* Can we unpin some objects such as idle hw contents,
	 * or pending flips?
	 */
	return -ENOSPC;
	ret = nonblocking ? -ENOSPC : i915_gpu_idle(dev);
	if (ret)
		return ret;

	/* Only idle the GPU and repeat the search once */
	i915_gem_retire_requests(dev);
	nonblocking = true;
	goto search_again;

found:
	/* drm_mm doesn't allow any other other operations while