diff mbox series

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

Message ID 20190501114541.10077-9-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series [01/14] drm/i915/hangcheck: Track context changes | expand

Commit Message

Chris Wilson May 1, 2019, 11:45 a.m. UTC
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(+)

Comments

Tvrtko Ursulin May 3, 2019, 11:03 a.m. UTC | #1
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
diff mbox series

Patch

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);