Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18bb8a6c authored by Rob Clark's avatar Rob Clark
Browse files

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: default avatarRob Clark <robdclark@gmail.com>
parent 78b8e5b8
Loading
Loading
Loading
Loading
+43 −12
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
#include "msm_mmu.h"
#include "msm_fence.h"

#include <linux/string_helpers.h>


/*
 * 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 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);
	fence = cur_ring->memptrs->fence + 1;

	list_for_each_entry(submit, &cur_ring->submits, node) {
		if (submit->seqno == fence) {
	submit = find_submit(cur_ring, fence);
	if (submit) {
		struct task_struct *task;

		rcu_read_lock();
		task = pid_task(submit->pid, PIDTYPE_PID);
		if (task) {
				dev_err(dev->dev, "%s: offending task: %s\n",
						gpu->name, task->comm);
			char *cmd;

			/*
			 * 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();
			break;
		}

	}

	if (msm_gpu_active(gpu)) {