[PATCH v5 1/8] drm/i915/guc: Fix locking when searching for a hung request
Ceraolo Spurio, Daniele
daniele.ceraolospurio at intel.com
Thu Jan 26 23:45:20 UTC 2023
On 1/25/2023 4:54 PM, John.C.Harrison at Intel.com wrote:
> From: John Harrison <John.C.Harrison at Intel.com>
>
> intel_guc_find_hung_context() was not acquiring the correct spinlock
> before searching the request list. So fix that up. While at it, add
> some extra whitespace padding for readability.
>
> Fixes: dc0dad365c5e ("drm/i915/guc: Fix for error capture after full GPU reset with GuC")
> Cc: John Harrison <John.C.Harrison at Intel.com>
> Cc: Matthew Brost <matthew.brost at intel.com>
> Cc: Jani Nikula <jani.nikula at linux.intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at linux.intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: Matt Roper <matthew.d.roper at intel.com>
> Cc: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>
> Cc: Michael Cheng <michael.cheng at intel.com>
> Cc: Lucas De Marchi <lucas.demarchi at intel.com>
> Cc: Tejas Upadhyay <tejaskumarx.surendrakumar.upadhyay at intel.com>
> Cc: Chris Wilson <chris.p.wilson at intel.com>
> Cc: Bruce Chang <yu.bruce.chang at intel.com>
> Cc: Alan Previn <alan.previn.teres.alexis at intel.com>
> Cc: Matthew Auld <matthew.auld at intel.com>
> Cc: intel-gfx at lists.freedesktop.org
> Signed-off-by: John Harrison <John.C.Harrison at Intel.com>
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
Daniele
> ---
> drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
> index b436dd7f12e42..3b34a82d692be 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
> @@ -4820,6 +4820,8 @@ void intel_guc_find_hung_context(struct intel_engine_cs *engine)
>
> xa_lock_irqsave(&guc->context_lookup, flags);
> xa_for_each(&guc->context_lookup, index, ce) {
> + bool found;
> +
> if (!kref_get_unless_zero(&ce->ref))
> continue;
>
> @@ -4836,10 +4838,18 @@ void intel_guc_find_hung_context(struct intel_engine_cs *engine)
> goto next;
> }
>
> + found = false;
> + spin_lock(&ce->guc_state.lock);
> list_for_each_entry(rq, &ce->guc_state.requests, sched.link) {
> if (i915_test_request_state(rq) != I915_REQUEST_ACTIVE)
> continue;
>
> + found = true;
> + break;
> + }
> + spin_unlock(&ce->guc_state.lock);
> +
> + if (found) {
> intel_engine_set_hung_context(engine, ce);
>
> /* Can only cope with one hang at a time... */
> @@ -4847,6 +4857,7 @@ void intel_guc_find_hung_context(struct intel_engine_cs *engine)
> xa_lock(&guc->context_lookup);
> goto done;
> }
> +
> next:
> intel_context_put(ce);
> xa_lock(&guc->context_lookup);
More information about the dri-devel
mailing list