]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Make use of drm_wedge_task_info
authorAndré Almeida <andrealmeid@igalia.com>
Tue, 17 Jun 2025 12:49:49 +0000 (09:49 -0300)
committerAndré Almeida <andrealmeid@igalia.com>
Tue, 17 Jun 2025 14:32:48 +0000 (11:32 -0300)
To notify userspace about which task (if any) made the device get in a
wedge state, make use of drm_wedge_task_info parameter, filling it with
the task PID and name.

Reviewed-by: Christian König <christian.koenig@amd.com>
Link: https://lore.kernel.org/r/20250617124949.2151549-7-andrealmeid@igalia.com
Signed-off-by: André Almeida <andrealmeid@igalia.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c

index 8a0f36f33f137c012aef6f6ceb2591c01327ce2a..a59f194e3360e5555a4d78097f1a9b30bd7a039f 100644 (file)
@@ -6363,8 +6363,17 @@ end_reset:
 
        atomic_set(&adev->reset_domain->reset_res, r);
 
-       if (!r)
-               drm_dev_wedged_event(adev_to_drm(adev), DRM_WEDGE_RECOVERY_NONE, NULL);
+       if (!r) {
+               struct amdgpu_task_info *ti = NULL;
+
+               if (job)
+                       ti = amdgpu_vm_get_task_info_pasid(adev, job->pasid);
+
+               drm_dev_wedged_event(adev_to_drm(adev), DRM_WEDGE_RECOVERY_NONE,
+                                    ti ? &ti->task : NULL);
+
+               amdgpu_vm_put_task_info(ti);
+       }
 
        return r;
 }
index 0c1381b527fea16a45222ba43f8329006ed1d4a7..1e24590ae1449f49e4632fbf2b931e04c03af8d5 100644 (file)
@@ -89,6 +89,7 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
 {
        struct amdgpu_ring *ring = to_amdgpu_ring(s_job->sched);
        struct amdgpu_job *job = to_amdgpu_job(s_job);
+       struct drm_wedge_task_info *info = NULL;
        struct amdgpu_task_info *ti;
        struct amdgpu_device *adev = ring->adev;
        int idx;
@@ -125,7 +126,7 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
        ti = amdgpu_vm_get_task_info_pasid(ring->adev, job->pasid);
        if (ti) {
                amdgpu_vm_print_task_info(adev, ti);
-               amdgpu_vm_put_task_info(ti);
+               info = &ti->task;
        }
 
        /* attempt a per ring reset */
@@ -164,13 +165,15 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
                        if (amdgpu_ring_sched_ready(ring))
                                drm_sched_start(&ring->sched, 0);
                        dev_err(adev->dev, "Ring %s reset succeeded\n", ring->sched.name);
-                       drm_dev_wedged_event(adev_to_drm(adev), DRM_WEDGE_RECOVERY_NONE, NULL);
+                       drm_dev_wedged_event(adev_to_drm(adev), DRM_WEDGE_RECOVERY_NONE, info);
                        goto exit;
                }
                dev_err(adev->dev, "Ring %s reset failure\n", ring->sched.name);
        }
        dma_fence_set_error(&s_job->s_fence->finished, -ETIME);
 
+       amdgpu_vm_put_task_info(ti);
+
        if (amdgpu_device_should_recover_gpu(ring->adev)) {
                struct amdgpu_reset_context reset_context;
                memset(&reset_context, 0, sizeof(reset_context));