Skip to content

Commit f51d753

Browse files
austriancoderlynxeye-dev
authored andcommitted
drm/etnaviv: print offender task information on hangcheck recovery
Track the pid per submit, so we can print the name and cmdline of the task which submitted the batch that caused the gpu to hang. Signed-off-by: Christian Gmeiner <[email protected]> Signed-off-by: Lucas Stach <[email protected]>
1 parent 3d7cb6b commit f51d753

File tree

5 files changed

+26
-3
lines changed

5 files changed

+26
-3
lines changed

drivers/gpu/drm/etnaviv/etnaviv_gem.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ struct etnaviv_gem_submit {
9696
int out_fence_id;
9797
struct list_head node; /* GPU active submit list */
9898
struct etnaviv_cmdbuf cmdbuf;
99+
struct pid *pid; /* submitting process */
99100
bool runtime_resumed;
100101
u32 exec_state;
101102
u32 flags;

drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,9 @@ static void submit_cleanup(struct kref *kref)
399399
mutex_unlock(&submit->gpu->fence_lock);
400400
dma_fence_put(submit->out_fence);
401401
}
402+
403+
put_pid(submit->pid);
404+
402405
kfree(submit->pmrs);
403406
kfree(submit);
404407
}
@@ -422,6 +425,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
422425
struct sync_file *sync_file = NULL;
423426
struct ww_acquire_ctx ticket;
424427
int out_fence_fd = -1;
428+
struct pid *pid = get_pid(task_pid(current));
425429
void *stream;
426430
int ret;
427431

@@ -519,6 +523,8 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
519523
goto err_submit_ww_acquire;
520524
}
521525

526+
submit->pid = pid;
527+
522528
ret = etnaviv_cmdbuf_init(priv->cmdbuf_suballoc, &submit->cmdbuf,
523529
ALIGN(args->stream_size, 8) + 8);
524530
if (ret)

drivers/gpu/drm/etnaviv/etnaviv_gpu.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1045,12 +1045,28 @@ int etnaviv_gpu_debugfs(struct etnaviv_gpu *gpu, struct seq_file *m)
10451045
}
10461046
#endif
10471047

1048-
void etnaviv_gpu_recover_hang(struct etnaviv_gpu *gpu)
1048+
void etnaviv_gpu_recover_hang(struct etnaviv_gem_submit *submit)
10491049
{
1050+
struct etnaviv_gpu *gpu = submit->gpu;
1051+
char *comm = NULL, *cmd = NULL;
1052+
struct task_struct *task;
10501053
unsigned int i;
10511054

10521055
dev_err(gpu->dev, "recover hung GPU!\n");
10531056

1057+
task = get_pid_task(submit->pid, PIDTYPE_PID);
1058+
if (task) {
1059+
comm = kstrdup(task->comm, GFP_KERNEL);
1060+
cmd = kstrdup_quotable_cmdline(task, GFP_KERNEL);
1061+
put_task_struct(task);
1062+
}
1063+
1064+
if (comm && cmd)
1065+
dev_err(gpu->dev, "offending task: %s (%s)\n", comm, cmd);
1066+
1067+
kfree(cmd);
1068+
kfree(comm);
1069+
10541070
if (pm_runtime_get_sync(gpu->dev) < 0)
10551071
goto pm_put;
10561072

drivers/gpu/drm/etnaviv/etnaviv_gpu.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ bool etnaviv_fill_identity_from_hwdb(struct etnaviv_gpu *gpu);
168168
int etnaviv_gpu_debugfs(struct etnaviv_gpu *gpu, struct seq_file *m);
169169
#endif
170170

171-
void etnaviv_gpu_recover_hang(struct etnaviv_gpu *gpu);
171+
void etnaviv_gpu_recover_hang(struct etnaviv_gem_submit *submit);
172172
void etnaviv_gpu_retire(struct etnaviv_gpu *gpu);
173173
int etnaviv_gpu_wait_fence_interruptible(struct etnaviv_gpu *gpu,
174174
u32 fence, struct drm_etnaviv_timespec *timeout);

drivers/gpu/drm/etnaviv/etnaviv_sched.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job
6767

6868
/* get the GPU back into the init state */
6969
etnaviv_core_dump(submit);
70-
etnaviv_gpu_recover_hang(gpu);
70+
etnaviv_gpu_recover_hang(submit);
7171

7272
drm_sched_resubmit_jobs(&gpu->sched);
7373

0 commit comments

Comments
 (0)