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

Tvrtko Ursulin
2019-05-03T11:03:59Z

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@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@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@intel.com>

Regards,

Tvrtko