[Intel-gfx] [PATCH v4] drm/i915: Check for awaits on still currently executing requests
Chris Wilson
chris at chris-wilson.co.uk
Fri May 29 14:03:57 UTC 2020
Quoting Chris Wilson (2020-05-29 13:28:51)
> With the advent of preempt-to-busy, a request may still be on the GPU as
> we unwind. And in the case of a unpreemptible [due to HW] request, that
> request will remain indefinitely on the GPU even though we have
> returned it back to our submission queue, and cleared the active bit.
>
> We only run the execution callbacks on transferring the request from our
> submission queue to the execution queue, but if this is a bonded request
> that the HW is waiting for, we will not submit it (as we wait for a
> fresh execution) even though it is still being executed.
>
> As we know that there are always preemption points between requests, we
> know that only the currently executing request may be still active even
> though we have cleared the flag.
>
> Fixes: 22b7a426bbe1 ("drm/i915/execlists: Preempt-to-busy")
> Testcase: igt/gem_exec_balancer/bonded-dual
> 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, 18 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
> index e5aba6824e26..2f0e9a63002d 100644
> --- a/drivers/gpu/drm/i915/i915_request.c
> +++ b/drivers/gpu/drm/i915/i915_request.c
> @@ -363,6 +363,23 @@ static void __llist_add(struct llist_node *node, struct llist_head *head)
> head->first = node;
> }
>
> +static bool __request_in_flight(const struct i915_request *signal)
> +{
> + /*
> + * Even if we have unwound the request, it may still be on
> + * the GPU (preempt-to-busy). If that request is inside an
> + * unpreemptible critical section, it will not be removed. Some
> + * GPU functions may even be stuck waiting for the paired request
> + * (__await_execution) to be submitted and cannot be preempted
> + * until the bond is executing.
> + *
> + * As we know that there are always preemption points between
> + * requests, we know that only the currently executing request
> + * may be still active even though we have cleared the flag.
> + */
> + return signal == execlists_active(&signal->engine->execlists);
Iff and only if there is one request in ELSP[0]. And presuming
process_csb has been run recently.
I think I'm back at intel_context_inflight(signal).
-Chris
More information about the Intel-gfx
mailing list