mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 17:41:44 +00:00
radeon: add bo tracking debugfs
This is to allow debugging of userspace program not freeing buffer after, which is basicly a memory leak. This print the list of all gem object along with their size and placement (VRAM,GTT,CPU) and with the pid of the task that created them. agd5f: add warning fix Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
62d1f92e06
commit
409851f489
@ -358,7 +358,8 @@ struct radeon_bo {
|
||||
struct radeon_device *rdev;
|
||||
struct drm_gem_object gem_base;
|
||||
|
||||
struct ttm_bo_kmap_obj dma_buf_vmap;
|
||||
struct ttm_bo_kmap_obj dma_buf_vmap;
|
||||
pid_t pid;
|
||||
};
|
||||
#define gem_to_radeon_bo(gobj) container_of((gobj), struct radeon_bo, gem_base)
|
||||
|
||||
@ -372,6 +373,8 @@ struct radeon_bo_list {
|
||||
u32 tiling_flags;
|
||||
};
|
||||
|
||||
int radeon_gem_debugfs_init(struct radeon_device *rdev);
|
||||
|
||||
/* sub-allocation manager, it has to be protected by another lock.
|
||||
* By conception this is an helper for other part of the driver
|
||||
* like the indirect buffer or semaphore, which both have their
|
||||
|
@ -1178,6 +1178,11 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||
if (r)
|
||||
DRM_ERROR("ib ring test failed (%d).\n", r);
|
||||
|
||||
r = radeon_gem_debugfs_init(rdev);
|
||||
if (r) {
|
||||
DRM_ERROR("registering gem debugfs failed (%d).\n", r);
|
||||
}
|
||||
|
||||
if (rdev->flags & RADEON_IS_AGP && !rdev->accel_working) {
|
||||
/* Acceleration not working on AGP card try again
|
||||
* with fallback to PCI or PCIE GART
|
||||
|
@ -84,6 +84,7 @@ retry:
|
||||
return r;
|
||||
}
|
||||
*obj = &robj->gem_base;
|
||||
robj->pid = task_pid_nr(current);
|
||||
|
||||
mutex_lock(&rdev->gem.mutex);
|
||||
list_add_tail(&robj->list, &rdev->gem.objects);
|
||||
@ -575,3 +576,52 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv,
|
||||
{
|
||||
return drm_gem_handle_delete(file_priv, handle);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
static int radeon_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 radeon_device *rdev = dev->dev_private;
|
||||
struct radeon_bo *rbo;
|
||||
unsigned i = 0;
|
||||
|
||||
mutex_lock(&rdev->gem.mutex);
|
||||
list_for_each_entry(rbo, &rdev->gem.objects, list) {
|
||||
unsigned domain;
|
||||
const char *placement;
|
||||
|
||||
domain = radeon_mem_type_to_domain(rbo->tbo.mem.mem_type);
|
||||
switch (domain) {
|
||||
case RADEON_GEM_DOMAIN_VRAM:
|
||||
placement = "VRAM";
|
||||
break;
|
||||
case RADEON_GEM_DOMAIN_GTT:
|
||||
placement = " GTT";
|
||||
break;
|
||||
case RADEON_GEM_DOMAIN_CPU:
|
||||
default:
|
||||
placement = " CPU";
|
||||
break;
|
||||
}
|
||||
seq_printf(m, "bo[0x%08x] %8ldkB %8ldMB %s pid %8ld\n",
|
||||
i, radeon_bo_size(rbo) >> 10, radeon_bo_size(rbo) >> 20,
|
||||
placement, (unsigned long)rbo->pid);
|
||||
i++;
|
||||
}
|
||||
mutex_unlock(&rdev->gem.mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct drm_info_list radeon_debugfs_gem_list[] = {
|
||||
{"radeon_gem_info", &radeon_debugfs_gem_info, 0, NULL},
|
||||
};
|
||||
#endif
|
||||
|
||||
int radeon_gem_debugfs_init(struct radeon_device *rdev)
|
||||
{
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
return radeon_debugfs_add_files(rdev, radeon_debugfs_gem_list, 1);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user