guc_create_virtual() takes a reference on guc->sched_engine for the
virtual engine, mirroring execlists, but the GuC destroy path never
drops it; rcu_virtual_context_destroy() does. Release the reference in
__guc_context_destroy() alongside the breadcrumbs reference.

Fixes: 556120256ecd ("drm/i915/guc: GuC virtual engines")
Cc: [email protected]
Signed-off-by: Wentao Liang <[email protected]>
---
 drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c | 2 ++
 1 file changed, 2 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 788e59cdfac9..7b88e081c76d 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
@@ -3487,6 +3487,8 @@ static void __guc_context_destroy(struct intel_context 
*ce)
 
                if (ve->base.breadcrumbs)
                        intel_breadcrumbs_put(ve->base.breadcrumbs);
+               if (ve->base.sched_engine)
+                       i915_sched_engine_put(ve->base.sched_engine);
 
                kfree(ve);
        } else {
-- 
2.34.1

Reply via email to