radeon: add bo tracking debugfs
authorJerome Glisse <jglisse@redhat.com>
Fri, 26 Apr 2013 02:29:27 +0000 (22:29 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 2 May 2013 14:09:47 +0000 (10:09 -0400)
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>
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_gem.c

index d6c8cbaa8693330909a40594240cee81bd888711..3ef7543a298686d1ef382631922996fc18c65a47 100644 (file)
@@ -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
index 237b7a7549e66d9452ea97eccc8c956b83aef5b5..a8f6089039896f47f22152746d6baeceb1b07603 100644 (file)
@@ -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
index fe5c1f6b795795530075939d39c06486ce42d29d..aa796031ab659147d546d978ec94a26d0f0bc808 100644 (file)
@@ -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;
+}