[Intel-gfx] [PATCH 06/16] drm/i915/gt: Decouple completed requests on unwind
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Tue Nov 24 17:13:02 UTC 2020
On 24/11/2020 11:42, Chris Wilson wrote:
> Since the introduction of preempt-to-busy, requests can complete in the
> background, even while they are not on the engine->active.requests list.
> As such, the engine->active.request list itself is not in strict
> retirement order, and we have to scan the entire list while unwinding to
> not miss any. However, if the request is completed we currently leave it
> on the list [until retirement], but we could just as simply remove it
> and stop treating it as active. We would only have to then traverse it
> once while unwinding in quick succession.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/gt/intel_lrc.c | 6 ++++--
> drivers/gpu/drm/i915/i915_request.c | 3 ++-
> 2 files changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index 30aa59fb7271..cf11cbac241b 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -1116,8 +1116,10 @@ __unwind_incomplete_requests(struct intel_engine_cs *engine)
> list_for_each_entry_safe_reverse(rq, rn,
> &engine->active.requests,
> sched.link) {
> - if (i915_request_completed(rq))
> - continue; /* XXX */
> + if (i915_request_completed(rq)) {
> + list_del_init(&rq->sched.link);
> + continue;
> + }
>
> __i915_request_unsubmit(rq);
>
> diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
> index 8d7d29c9e375..a9db1376b996 100644
> --- a/drivers/gpu/drm/i915/i915_request.c
> +++ b/drivers/gpu/drm/i915/i915_request.c
> @@ -321,7 +321,8 @@ bool i915_request_retire(struct i915_request *rq)
> * after removing the breadcrumb and signaling it, so that we do not
> * inadvertently attach the breadcrumb to a completed request.
> */
> - remove_from_engine(rq);
> + if (!list_empty(&rq->sched.link))
> + remove_from_engine(rq);
The list_empty check is unlocked so is list_del_init in
remove_from_engine safe on potentially already unlinked request or it
needs to re-check under the lock?
Regards,
Tvrtko
> GEM_BUG_ON(!llist_empty(&rq->execute_cb));
>
> __list_del_entry(&rq->link); /* poison neither prev/next (RCU walks) */
>
More information about the Intel-gfx
mailing list