aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0325-drm-amdgpu-rework-GEM-info-printing.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0325-drm-amdgpu-rework-GEM-info-printing.patch')
-rw-r--r--common/recipes-kernel/linux/files/0325-drm-amdgpu-rework-GEM-info-printing.patch150
1 files changed, 150 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0325-drm-amdgpu-rework-GEM-info-printing.patch b/common/recipes-kernel/linux/files/0325-drm-amdgpu-rework-GEM-info-printing.patch
new file mode 100644
index 00000000..059de0b6
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0325-drm-amdgpu-rework-GEM-info-printing.patch
@@ -0,0 +1,150 @@
+From 8c97cc2e58f806aec91a47949daf5a57c041e188 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Mon, 15 Feb 2016 15:23:00 +0100
+Subject: [PATCH 0325/1110] drm/amdgpu: rework GEM info printing
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Print BOs grouped per client.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 -
+ drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 94 +++++++++++++++++++++------------
+ 2 files changed, 61 insertions(+), 34 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 9a9673c..ba66640 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -493,7 +493,6 @@ struct amdgpu_bo {
+ struct amdgpu_bo *parent;
+
+ struct ttm_bo_kmap_obj dma_buf_vmap;
+- pid_t pid;
+ struct amdgpu_mn *mn;
+ struct list_head mn_list;
+ };
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+index 86ce4f3..c44905a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+@@ -83,7 +83,6 @@ retry:
+ return r;
+ }
+ *obj = &robj->gem_base;
+- robj->pid = task_pid_nr(current);
+
+ mutex_lock(&adev->gem.mutex);
+ list_add_tail(&robj->list, &adev->gem.objects);
+@@ -695,44 +694,73 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
+ }
+
+ #if defined(CONFIG_DEBUG_FS)
++static int amdgpu_debugfs_gem_bo_info(int id, void *ptr, void *data)
++{
++ struct drm_gem_object *gobj = ptr;
++ struct amdgpu_bo *bo = gem_to_amdgpu_bo(gobj);
++ struct seq_file *m = data;
++
++ unsigned domain;
++ const char *placement;
++ unsigned pin_count;
++
++ domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
++ switch (domain) {
++ case AMDGPU_GEM_DOMAIN_VRAM:
++ placement = "VRAM";
++ break;
++ case AMDGPU_GEM_DOMAIN_GTT:
++ placement = " GTT";
++ break;
++ case AMDGPU_GEM_DOMAIN_CPU:
++ default:
++ placement = " CPU";
++ break;
++ }
++ seq_printf(m, "\t0x%08x: %12ld byte %s @ 0x%010Lx",
++ id, amdgpu_bo_size(bo), placement,
++ amdgpu_bo_gpu_offset(bo));
++
++ pin_count = ACCESS_ONCE(bo->pin_count);
++ if (pin_count)
++ seq_printf(m, " pin count %d", pin_count);
++ seq_printf(m, "\n");
++
++ return 0;
++}
++
+ static int amdgpu_debugfs_gem_info(struct seq_file *m, void *data)
+ {
+ struct drm_info_node *node = (struct drm_info_node *)m->private;
+ struct drm_device *dev = node->minor->dev;
+- struct amdgpu_device *adev = dev->dev_private;
+- struct amdgpu_bo *rbo;
+- unsigned i = 0;
++ struct drm_file *file;
++ int r;
+
+- mutex_lock(&adev->gem.mutex);
+- list_for_each_entry(rbo, &adev->gem.objects, list) {
+- unsigned pin_count;
+- unsigned domain;
+- const char *placement;
+-
+- domain = amdgpu_mem_type_to_domain(rbo->tbo.mem.mem_type);
+- switch (domain) {
+- case AMDGPU_GEM_DOMAIN_VRAM:
+- placement = "VRAM";
+- break;
+- case AMDGPU_GEM_DOMAIN_GTT:
+- placement = " GTT";
+- break;
+- case AMDGPU_GEM_DOMAIN_CPU:
+- default:
+- placement = " CPU";
+- break;
+- }
+- seq_printf(m, "bo[0x%08x] %12ld %s @ 0x%010Lx pid %8d",
+- i, amdgpu_bo_size(rbo), placement,
+- amdgpu_bo_gpu_offset(rbo), rbo->pid);
+-
+- pin_count = ACCESS_ONCE(rbo->pin_count);
+- if (pin_count)
+- seq_printf(m, " pin count %d", pin_count);
+- seq_printf(m, "\n");
+- i++;
++ r = mutex_lock_interruptible(&dev->struct_mutex);
++ if (r)
++ return r;
++
++ list_for_each_entry(file, &dev->filelist, lhead) {
++ struct task_struct *task;
++
++ /*
++ * Although we have a valid reference on file->pid, that does
++ * not guarantee that the task_struct who called get_pid() is
++ * still alive (e.g. get_pid(current) => fork() => exit()).
++ * Therefore, we need to protect this ->comm access using RCU.
++ */
++ rcu_read_lock();
++ task = pid_task(file->pid, PIDTYPE_PID);
++ seq_printf(m, "pid %8d command %s:\n", pid_nr(file->pid),
++ task ? task->comm : "<unknown>");
++ rcu_read_unlock();
++
++ spin_lock(&file->table_lock);
++ idr_for_each(&file->object_idr, amdgpu_debugfs_gem_bo_info, m);
++ spin_unlock(&file->table_lock);
+ }
+- mutex_unlock(&adev->gem.mutex);
++
++ mutex_unlock(&dev->struct_mutex);
+ return 0;
+ }
+
+--
+2.7.4
+