drm/i915: Lift timeline ordering to await_dma_fence
Currently we filter out repeated use of the same timeline in the low level i915_gem_request_await_request(), after having added the dependency on the old request. However, we can lift this to i915_gem_request_await_dma_fence() (before the dependency is added) using the observation that requests along the same timeline are explicitly ordered via i915_add_request (along with the dependencies). Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170503093924.5320-3-chris@chris-wilson.co.uk
This commit is contained in:
parent
29ef3fa987
commit
ceae14bd4c
|
@ -687,6 +687,7 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,
|
|||
int ret;
|
||||
|
||||
GEM_BUG_ON(to == from);
|
||||
GEM_BUG_ON(to->timeline == from->timeline);
|
||||
|
||||
if (i915_gem_request_completed(from))
|
||||
return 0;
|
||||
|
@ -699,9 +700,6 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (to->timeline == from->timeline)
|
||||
return 0;
|
||||
|
||||
if (to->engine == from->engine) {
|
||||
ret = i915_sw_fence_await_sw_fence_gfp(&to->submit,
|
||||
&from->submit,
|
||||
|
@ -767,6 +765,14 @@ i915_gem_request_await_dma_fence(struct drm_i915_gem_request *req,
|
|||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Requests on the same timeline are explicitly ordered, along
|
||||
* with their dependencies, by i915_add_request() which ensures
|
||||
* that requests are submitted in-order through each ring.
|
||||
*/
|
||||
if (fence->context == req->fence.context)
|
||||
continue;
|
||||
|
||||
if (dma_fence_is_i915(fence))
|
||||
ret = i915_gem_request_await_request(req,
|
||||
to_request(fence));
|
||||
|
|
Loading…
Reference in New Issue