[Intel-gfx] [PATCH 2/7] drm/i915: Unwrap top level fence-array
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Wed May 3 09:00:02 UTC 2017
On 03/05/2017 00:41, Chris Wilson wrote:
> By first unwrapping an incoming fence-array into its child fences, we
> can simplify the internal branching, and so avoid triggering a potential
Potential something?
> in the next patch when not squashing the child fences on the same timeline.
>
> It will also have the advantage of keeping the (top-level) fence arrays
> out of any fence/timeline caching since these are unordered timelines
> but with a random context id.
Is it a random context id or just one not associated with any user
contexts and not ever exported to userspace?
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> ---
> drivers/gpu/drm/i915/i915_gem_request.c | 41 +++++++++++++++------------------
> 1 file changed, 18 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
> index 6198f6997d05..b68935d056c5 100644
> --- a/drivers/gpu/drm/i915/i915_gem_request.c
> +++ b/drivers/gpu/drm/i915/i915_gem_request.c
> @@ -743,22 +743,9 @@ int
> i915_gem_request_await_dma_fence(struct drm_i915_gem_request *req,
> struct dma_fence *fence)
> {
> - struct dma_fence_array *array;
> + struct dma_fence **child = &fence;
> + unsigned int nchild = 1;
> int ret;
> - int i;
> -
> - if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
> - return 0;
> -
> - if (dma_fence_is_i915(fence))
> - return i915_gem_request_await_request(req, to_request(fence));
> -
> - if (!dma_fence_is_array(fence)) {
> - ret = i915_sw_fence_await_dma_fence(&req->submit,
> - fence, I915_FENCE_TIMEOUT,
> - GFP_KERNEL);
> - return ret < 0 ? ret : 0;
> - }
>
> /* Note that if the fence-array was created in signal-on-any mode,
> * we should *not* decompose it into its individual fences. However,
> @@ -767,21 +754,29 @@ i915_gem_request_await_dma_fence(struct drm_i915_gem_request *req,
> * amdgpu and we should not see any incoming fence-array from
> * sync-file being in signal-on-any mode.
> */
> + if (dma_fence_is_array(fence)) {
> + struct dma_fence_array *array = to_dma_fence_array(fence);
> +
> + child = array->fences;
> + nchild = array->num_fences;
> + GEM_BUG_ON(!nchild);
> + }
>
> - array = to_dma_fence_array(fence);
> - for (i = 0; i < array->num_fences; i++) {
> - struct dma_fence *child = array->fences[i];
> + do {
> + fence = *child++;
> + if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
> + continue;
>
> - if (dma_fence_is_i915(child))
> + if (dma_fence_is_i915(fence))
> ret = i915_gem_request_await_request(req,
> - to_request(child));
> + to_request(fence));
> else
> - ret = i915_sw_fence_await_dma_fence(&req->submit,
> - child, I915_FENCE_TIMEOUT,
> + ret = i915_sw_fence_await_dma_fence(&req->submit, fence,
> + I915_FENCE_TIMEOUT,
> GFP_KERNEL);
> if (ret < 0)
> return ret;
> - }
> + } while (--nchild);
>
> return 0;
> }
>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list