When a mode reset happens, driver needs to notify the process on that
GPU a reset event is happening. The existing code assumes the process is
using the GPU that is getting mode reset, which is not always true. For
example, on a 8G system, the process may be only using GPU 0~4 but a
mode 2 reset is resetting the all 8 GPUs connected by XGMI. Trying to
find a process on GPU 5~7 will fail, which is fine and should skip the
event signal.

Signed-off-by: Amber Lin <[email protected]>
---
 drivers/gpu/drm/amd/amdkfd/kfd_events.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index 5fa156e89a73..6e32a892d56f 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -1164,6 +1164,8 @@ void kfd_signal_reset_event(struct kfd_node *dev)
        struct kfd_event *ev;
        unsigned int temp;
        uint32_t id, idx;
+       int user_gpu_id;
+       struct kfd_process_device *pdd;
        int reset_cause = atomic_read(&dev->sram_ecc_flag) ?
                        KFD_HW_EXCEPTION_ECC :
                        KFD_HW_EXCEPTION_GPU_HANG;
@@ -1179,17 +1181,14 @@ void kfd_signal_reset_event(struct kfd_node *dev)
 
        idx = srcu_read_lock(&kfd_processes_srcu);
        hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {
-               int user_gpu_id = kfd_process_get_user_gpu_id(p, dev->id);
-               struct kfd_process_device *pdd = 
kfd_get_process_device_data(dev, p);
-
-               if (unlikely(user_gpu_id == -EINVAL)) {
-                       WARN_ONCE(1, "Could not get user_gpu_id from 
dev->id:%x\n", dev->id);
+               pdd = kfd_get_process_device_data(dev, p);
+               if (!pdd)
+                       /* no process is using this device */
                        continue;
-               }
+               user_gpu_id = kfd_process_get_user_gpu_id(p, dev->id);
 
-               if (unlikely(!pdd)) {
-                       WARN_ONCE(1, "Could not get device data from process 
pid:%d\n",
-                                 p->lead_thread->pid);
+               if (unlikely(user_gpu_id == -EINVAL)) {
+                       WARN_ONCE(1, "Could not get user_gpu_id from 
dev->id:%d\n", dev->id);
                        continue;
                }
 
-- 
2.43.0

Reply via email to