drm/i915/guc: Fix issues with live_preempt_cancel
Having semaphores results in different behavior when a dependent request is cancelled. In the case of semaphores the request could be on the HW and complete successfully while without the request is held in the driver and the error from the dependent request is propagated. Fix live_preempt_cancel to take this behavior into account. Also update live_preempt_cancel to use new function intel_context_ban rather than intel_context_set_banned. Signed-off-by: Matthew Brost <matthew.brost@intel.com> Signed-off-by: John Harrison <John.C.Harrison@Intel.com> Reviewed-by: John Harrison <John.C.Harrison@Intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220728024225.2363663-3-John.C.Harrison@Intel.com
This commit is contained in:
parent
9fb3473732
commit
15c5401dee
@ -2077,7 +2077,7 @@ static int __cancel_active0(struct live_preempt_cancel *arg)
|
||||
goto out;
|
||||
}
|
||||
|
||||
intel_context_set_banned(rq->context);
|
||||
intel_context_ban(rq->context, rq);
|
||||
err = intel_engine_pulse(arg->engine);
|
||||
if (err)
|
||||
goto out;
|
||||
@ -2136,7 +2136,7 @@ static int __cancel_active1(struct live_preempt_cancel *arg)
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
intel_context_set_banned(rq[1]->context);
|
||||
intel_context_ban(rq[1]->context, rq[1]);
|
||||
err = intel_engine_pulse(arg->engine);
|
||||
if (err)
|
||||
goto out;
|
||||
@ -2219,7 +2219,7 @@ static int __cancel_queued(struct live_preempt_cancel *arg)
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
intel_context_set_banned(rq[2]->context);
|
||||
intel_context_ban(rq[2]->context, rq[2]);
|
||||
err = intel_engine_pulse(arg->engine);
|
||||
if (err)
|
||||
goto out;
|
||||
@ -2234,7 +2234,13 @@ static int __cancel_queued(struct live_preempt_cancel *arg)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (rq[1]->fence.error != 0) {
|
||||
/*
|
||||
* The behavior between having semaphores and not is different. With
|
||||
* semaphores the subsequent request is on the hardware and not cancelled
|
||||
* while without the request is held in the driver and cancelled.
|
||||
*/
|
||||
if (intel_engine_has_semaphores(rq[1]->engine) &&
|
||||
rq[1]->fence.error != 0) {
|
||||
pr_err("Normal inflight1 request did not complete\n");
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
@ -2282,7 +2288,7 @@ static int __cancel_hostile(struct live_preempt_cancel *arg)
|
||||
goto out;
|
||||
}
|
||||
|
||||
intel_context_set_banned(rq->context);
|
||||
intel_context_ban(rq->context, rq);
|
||||
err = intel_engine_pulse(arg->engine); /* force reset */
|
||||
if (err)
|
||||
goto out;
|
||||
|
Loading…
x
Reference in New Issue
Block a user