Unverified Commit 00907da2 authored by Niranjana Vishwanathapura's avatar Niranjana Vishwanathapura Committed by Rodrigo Vivi
Browse files

drm/xe/multi_queue: Fix secondary queue error case



If xe_lrc_create() fails, the secondary queue added to the
multi-queue group list is not removed before freeing the
queue. Fix error path handling for secondary queues by
removing it from the multi-queue group list at the right
place.

Reported-by: default avatarSebastian Österlund <sebastian.osterlund@intel.com>
Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/7979


Fixes: d716a508 ("drm/xe/multi_queue: Handle tearing down of a multi queue")
Cc: stable@vger.kernel.org # v7.0+
Signed-off-by: default avatarNiranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patch.msgid.link/20260518191639.320890-2-niranjana.vishwanathapura@intel.com


(cherry picked from commit d2d23c12789cf69eddc35b8d38cd8eaabd0168f1)
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent 6df5678b
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -1673,6 +1673,14 @@ static void guc_exec_queue_fini(struct xe_exec_queue *q)
	struct xe_guc_exec_queue *ge = q->guc;
	struct xe_guc *guc = exec_queue_to_guc(q);

	if (xe_exec_queue_is_multi_queue_secondary(q)) {
		struct xe_exec_queue_group *group = q->multi_queue.group;

		mutex_lock(&group->list_lock);
		list_del(&q->multi_queue.link);
		mutex_unlock(&group->list_lock);
	}

	release_guc_id(guc, q);
	xe_sched_entity_fini(&ge->entity);
	xe_sched_fini(&ge->sched);
@@ -1694,14 +1702,6 @@ static void __guc_exec_queue_destroy_async(struct work_struct *w)
	guard(xe_pm_runtime)(guc_to_xe(guc));
	trace_xe_exec_queue_destroy(q);

	if (xe_exec_queue_is_multi_queue_secondary(q)) {
		struct xe_exec_queue_group *group = q->multi_queue.group;

		mutex_lock(&group->list_lock);
		list_del(&q->multi_queue.link);
		mutex_unlock(&group->list_lock);
	}

	/* Confirm no work left behind accessing device structures */
	cancel_delayed_work_sync(&ge->sched.base.work_tdr);