]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe: Release guc ids before cancelling work
authorTejas Upadhyay <tejas.upadhyay@intel.com>
Thu, 6 Mar 2025 13:12:11 +0000 (18:42 +0530)
committerLucas De Marchi <lucas.demarchi@intel.com>
Fri, 7 Mar 2025 08:08:37 +0000 (00:08 -0800)
A GT resets can be occurring in parallel while cancelling
work in async call  which can requeue these workers.
to avoid that, lets first release guc ids and then cancel
work so they don't requeued.

Fixes: 8ae8a2e8dd21 ("drm/xe: Long running job update")
Fixes: 18fbd567e75f ("drm/xe: cancel pending job timer before freeing scheduler")
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
Suggested-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250306131211.975503-1-tejas.upadhyay@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
drivers/gpu/drm/xe/xe_guc_submit.c

index b95934055f727baf975f8f642927e800010ba26e..31bc2022bfc2d80f0ef54726dfeb8d7f8e6b32c8 100644 (file)
@@ -1254,11 +1254,11 @@ static void __guc_exec_queue_fini_async(struct work_struct *w)
        xe_pm_runtime_get(guc_to_xe(guc));
        trace_xe_exec_queue_destroy(q);
 
+       release_guc_id(guc, q);
        if (xe_exec_queue_is_lr(q))
                cancel_work_sync(&ge->lr_tdr);
        /* Confirm no work left behind accessing device structures */
        cancel_delayed_work_sync(&ge->sched.base.work_tdr);
-       release_guc_id(guc, q);
        xe_sched_entity_fini(&ge->entity);
        xe_sched_fini(&ge->sched);