drm/msm: show task cmdline in gpu recovery messages
Now that freedreno gallium driver defaults to using submit_queue task (render reordering), just showing task->comm is not so useful (ie. it is always "flush_queue:0"), so also dump the cmdline. This should also be more useful for piglit/shader_runner. Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
parent
78b8e5b847
commit
18bb8a6c89
@ -20,6 +20,8 @@
|
|||||||
#include "msm_mmu.h"
|
#include "msm_mmu.h"
|
||||||
#include "msm_fence.h"
|
#include "msm_fence.h"
|
||||||
|
|
||||||
|
#include <linux/string_helpers.h>
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Power Management:
|
* Power Management:
|
||||||
@ -235,6 +237,20 @@ static void update_fences(struct msm_gpu *gpu, struct msm_ringbuffer *ring,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct msm_gem_submit *
|
||||||
|
find_submit(struct msm_ringbuffer *ring, uint32_t fence)
|
||||||
|
{
|
||||||
|
struct msm_gem_submit *submit;
|
||||||
|
|
||||||
|
WARN_ON(!mutex_is_locked(&ring->gpu->dev->struct_mutex));
|
||||||
|
|
||||||
|
list_for_each_entry(submit, &ring->submits, node)
|
||||||
|
if (submit->seqno == fence)
|
||||||
|
return submit;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void retire_submits(struct msm_gpu *gpu);
|
static void retire_submits(struct msm_gpu *gpu);
|
||||||
|
|
||||||
static void recover_worker(struct work_struct *work)
|
static void recover_worker(struct work_struct *work)
|
||||||
@ -268,19 +284,34 @@ static void recover_worker(struct work_struct *work)
|
|||||||
dev_err(dev->dev, "%s: hangcheck recover!\n", gpu->name);
|
dev_err(dev->dev, "%s: hangcheck recover!\n", gpu->name);
|
||||||
fence = cur_ring->memptrs->fence + 1;
|
fence = cur_ring->memptrs->fence + 1;
|
||||||
|
|
||||||
list_for_each_entry(submit, &cur_ring->submits, node) {
|
submit = find_submit(cur_ring, fence);
|
||||||
if (submit->seqno == fence) {
|
if (submit) {
|
||||||
struct task_struct *task;
|
struct task_struct *task;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
task = pid_task(submit->pid, PIDTYPE_PID);
|
task = pid_task(submit->pid, PIDTYPE_PID);
|
||||||
if (task) {
|
if (task) {
|
||||||
dev_err(dev->dev, "%s: offending task: %s\n",
|
char *cmd;
|
||||||
gpu->name, task->comm);
|
|
||||||
|
/*
|
||||||
|
* So slightly annoying, in other paths like
|
||||||
|
* mmap'ing gem buffers, mmap_sem is acquired
|
||||||
|
* before struct_mutex, which means we can't
|
||||||
|
* hold struct_mutex across the call to
|
||||||
|
* get_cmdline(). But submits are retired
|
||||||
|
* from the same in-order workqueue, so we can
|
||||||
|
* safely drop the lock here without worrying
|
||||||
|
* about the submit going away.
|
||||||
|
*/
|
||||||
|
mutex_unlock(&dev->struct_mutex);
|
||||||
|
cmd = kstrdup_quotable_cmdline(task, GFP_KERNEL);
|
||||||
|
mutex_lock(&dev->struct_mutex);
|
||||||
|
|
||||||
|
dev_err(dev->dev, "%s: offending task: %s (%s)\n",
|
||||||
|
gpu->name, task->comm, cmd);
|
||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msm_gpu_active(gpu)) {
|
if (msm_gpu_active(gpu)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user