[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