diff options
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.patch | 150 |
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 + |