]> www.infradead.org Git - users/dwmw2/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)
committerLucas De Marchi <lucas.demarchi@intel.com>
Thu, 24 Oct 2024 17:42:52 +0000 (12:42 -0500)
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>
(cherry picked from commit c8b0acd6d8745fd7e6450f5acc38f0227bd253b3)
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
drivers/gpu/drm/xe/xe_guc_submit.c

index 8a9254e5af6e6d11a916fd4ab335dbbd50d21ce8..d333be9c4227760d629dcd5414f71c89e015daa5 100644 (file)
@@ -1726,8 +1726,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);
 
@@ -1765,8 +1770,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);