mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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
					
				
					 1 changed files with 42 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
			struct task_struct *task;
 | 
			
		||||
	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);
 | 
			
		||||
			}
 | 
			
		||||
			rcu_read_unlock();
 | 
			
		||||
			break;
 | 
			
		||||
		rcu_read_lock();
 | 
			
		||||
		task = pid_task(submit->pid, PIDTYPE_PID);
 | 
			
		||||
		if (task) {
 | 
			
		||||
			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();
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (msm_gpu_active(gpu)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue