]> www.infradead.org Git - linux.git/commitdiff
drm/xe: Don't restart parallel queues multiple times on GT reset
authorNirmoy Das <nirmoy.das@intel.com>
Tue, 22 Oct 2024 10:35:55 +0000 (12:35 +0200)
committerNirmoy Das <nirmoy.das@intel.com>
Wed, 23 Oct 2024 11:08:21 +0000 (13:08 +0200)
In case of parallel submissions multiple GuC id will point to the
same exec queue and on GT reset such exec queues will get restarted
multiple times which is not desirable.

v2: don't use exec_queue_enabled() which could race,
    do the same for xe_guc_submit_stop (Matt B)

Link: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/2295
Cc: Jonathan Cavitt <jonathan.cavitt@intel.com>
Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Tejas Upadhyay <tejas.upadhyay@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241022103555.731557-1-nirmoy.das@intel.com
Signed-off-by: Nirmoy Das <nirmoy.das@intel.com>
drivers/gpu/drm/xe/xe_guc_submit.c

index fc8ababc79fbced3cf36bcc6d593a85fde0cdafe..2b6ac1de8ec031d40324f3b658b2d448d87b985e 100644 (file)
@@ -1819,8 +1819,13 @@ void xe_guc_submit_stop(struct xe_guc *guc)
 
        mutex_lock(&guc->submission_state.lock);
 
-       xa_for_each(&guc->submission_state.exec_queue_lookup, index, q)
+       xa_for_each(&guc->submission_state.exec_queue_lookup, index, q) {
+               /* Prevent redundant attempts to stop parallel queues */
+               if (q->guc->id != index)
+                       continue;
+
                guc_exec_queue_stop(guc, q);
+       }
 
        mutex_unlock(&guc->submission_state.lock);
 
@@ -1858,8 +1863,13 @@ int xe_guc_submit_start(struct xe_guc *guc)
 
        mutex_lock(&guc->submission_state.lock);
        atomic_dec(&guc->submission_state.stopped);
-       xa_for_each(&guc->submission_state.exec_queue_lookup, index, q)
+       xa_for_each(&guc->submission_state.exec_queue_lookup, index, q) {
+               /* Prevent redundant attempts to start parallel queues */
+               if (q->guc->id != index)
+                       continue;
+
                guc_exec_queue_start(q);
+       }
        mutex_unlock(&guc->submission_state.lock);
 
        wake_up_all(&guc->ct.wq);