[Intel-gfx] [PATCH 09/14] drm/i915: Delay semaphore submission until the start of the signaler

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Fri May 3 11:03:56 UTC 2019


On 01/05/2019 12:45, Chris Wilson wrote:
> Currently we submit the semaphore busywait as soon as the signaler is
> submitted to HW. However, we may submit the signaler as the tail of a
> batch of requests, and even not as the first context in the HW list,
> i.e. the busywait may start spinning far in advance of the signaler even
> starting.
> 
> If we wait until the request before the signaler is completed before
> submitting the busywait, we prevent the busywait from starting too
> early, if the signaler is not first in submission port.
> 
> To handle the case where the signaler is at the start of the second (or
> later) submission port, we will need to delay the execution callback
> until we know the context is promoted to port0. A challenge for later.
> 
> Fixes: e88619646971 ("drm/i915: Use HW semaphores for inter-engine synchroni
> sation on gen8+")
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
>   drivers/gpu/drm/i915/i915_request.c | 19 +++++++++++++++++++
>   1 file changed, 19 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
> index 2e22da66a56c..8cb3ed5531e3 100644
> --- a/drivers/gpu/drm/i915/i915_request.c
> +++ b/drivers/gpu/drm/i915/i915_request.c
> @@ -770,6 +770,21 @@ i915_request_create(struct intel_context *ce)
>   	return rq;
>   }
>   
> +static int
> +i915_request_await_start(struct i915_request *rq, struct i915_request *signal)
> +{
> +	if (list_is_first(&signal->ring_link, &signal->ring->request_list))
> +		return 0;
> +
> +	signal = list_prev_entry(signal, ring_link);
> +	if (i915_timeline_sync_is_later(rq->timeline, &signal->fence))
> +		return 0;
> +
> +	return i915_sw_fence_await_dma_fence(&rq->submit,
> +					     &signal->fence, 0,
> +					     I915_FENCE_GFP);
> +}
> +
>   static int
>   emit_semaphore_wait(struct i915_request *to,
>   		    struct i915_request *from,
> @@ -788,6 +803,10 @@ emit_semaphore_wait(struct i915_request *to,
>   						     &from->fence, 0,
>   						     I915_FENCE_GFP);
>   
> +	err = i915_request_await_start(to, from);
> +	if (err < 0)
> +		return err;
> +
>   	err = i915_sw_fence_await_dma_fence(&to->semaphore,
>   					    &from->fence, 0,
>   					    I915_FENCE_GFP);
> 

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Regards,

Tvrtko


More information about the Intel-gfx mailing list