Re: [PATCH] drm/mm: add ability to dump mm lists via debugfs (v2)
Dave Airlie wrote: From: Dave Airlie airl...@linux.ie This adds code to the drm_mm to talk to debugfs, and adds support to radeon to add the VRAM and GTT mm lists to debugfs. changes since v1: don't bother with free list just add used/free to main list add totals in pages Signed-off-by: Dave Airlie airl...@redhat.com --- drivers/gpu/drm/drm_mm.c| 25 ++ drivers/gpu/drm/radeon/radeon_ttm.c | 39 +++ include/drm/drm_mm.h|4 +++ 3 files changed, 68 insertions(+), 0 deletions(-) diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index 3e47869..a454e55 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c @@ -44,6 +44,7 @@ #include drmP.h #include drm_mm.h #include linux/slab.h +#include linux/seq_file.h #define MM_UNUSED_TARGET 4 @@ -370,3 +371,27 @@ void drm_mm_takedown(struct drm_mm * mm) BUG_ON(mm-num_unused != 0); } EXPORT_SYMBOL(drm_mm_takedown); + +#if defined(CONFIG_DEBUG_FS) +int drm_mm_dump_table(struct seq_file *m, void *data) +{ + struct drm_info_node *node = (struct drm_info_node *)m-private; + struct drm_mm *mm = (struct drm_mm *)node-info_ent-data; + struct drm_mm_node *entry; + int total_used = 0, total_free = 0, total = 0; + spin_lock(mm-unused_lock); This is not correct. The mm::unused_lock is there only to protect the list of cached drm_mm_node allocations that we use instead of kmalloc() when atomic. Instead the lock the user uses to protect the mm:s must be taken. In the TTM case IIRC its the bo_glob::lru_lock. Is it safe to use seq_printf() from within a spinlocked region? Otherwise looks nice. /Thomas -- Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july -- ___ Dri-devel mailing list Dri-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dri-devel
Re: [PATCH] drm/mm: add ability to dump mm lists via debugfs (v2)
2009/8/21 Thomas Hellström tho...@shipmail.org: Dave Airlie wrote: From: Dave Airlie airl...@linux.ie This adds code to the drm_mm to talk to debugfs, and adds support to radeon to add the VRAM and GTT mm lists to debugfs. changes since v1: don't bother with free list just add used/free to main list add totals in pages Signed-off-by: Dave Airlie airl...@redhat.com --- drivers/gpu/drm/drm_mm.c | 25 ++ drivers/gpu/drm/radeon/radeon_ttm.c | 39 +++ include/drm/drm_mm.h | 4 +++ 3 files changed, 68 insertions(+), 0 deletions(-) diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index 3e47869..a454e55 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c @@ -44,6 +44,7 @@ #include drmP.h #include drm_mm.h #include linux/slab.h +#include linux/seq_file.h #define MM_UNUSED_TARGET 4 @@ -370,3 +371,27 @@ void drm_mm_takedown(struct drm_mm * mm) BUG_ON(mm-num_unused != 0); } EXPORT_SYMBOL(drm_mm_takedown); + +#if defined(CONFIG_DEBUG_FS) +int drm_mm_dump_table(struct seq_file *m, void *data) +{ + struct drm_info_node *node = (struct drm_info_node *)m-private; + struct drm_mm *mm = (struct drm_mm *)node-info_ent-data; + struct drm_mm_node *entry; + int total_used = 0, total_free = 0, total = 0; + spin_lock(mm-unused_lock); This is not correct. The mm::unused_lock is there only to protect the list of cached drm_mm_node allocations that we use instead of kmalloc() when atomic. Instead the lock the user uses to protect the mm:s must be taken. In the TTM case IIRC its the bo_glob::lru_lock. Is it safe to use seq_printf() from within a spinlocked region? Good point, this was one of those quick hacks to have a look at fragmentation so I sorta guessed at the lock, I'd probably be best not locking anything, but I'll try and add a driver layer before drm_mm to do the correct locking, though as its debugging info even inconsistent is better than none. I'll fix it up next week and send v3, thanks again. Dave. -- Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july -- ___ Dri-devel mailing list Dri-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dri-devel
Re: [PATCH] drm/mm: add ability to dump mm lists via debugfs (v2)
Dave Airlie wrote: 2009/8/21 Thomas Hellström tho...@shipmail.org: Dave Airlie wrote: From: Dave Airlie airl...@linux.ie This adds code to the drm_mm to talk to debugfs, and adds support to radeon to add the VRAM and GTT mm lists to debugfs. changes since v1: don't bother with free list just add used/free to main list add totals in pages Signed-off-by: Dave Airlie airl...@redhat.com --- drivers/gpu/drm/drm_mm.c| 25 ++ drivers/gpu/drm/radeon/radeon_ttm.c | 39 +++ include/drm/drm_mm.h|4 +++ 3 files changed, 68 insertions(+), 0 deletions(-) diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index 3e47869..a454e55 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c @@ -44,6 +44,7 @@ #include drmP.h #include drm_mm.h #include linux/slab.h +#include linux/seq_file.h #define MM_UNUSED_TARGET 4 @@ -370,3 +371,27 @@ void drm_mm_takedown(struct drm_mm * mm) BUG_ON(mm-num_unused != 0); } EXPORT_SYMBOL(drm_mm_takedown); + +#if defined(CONFIG_DEBUG_FS) +int drm_mm_dump_table(struct seq_file *m, void *data) +{ + struct drm_info_node *node = (struct drm_info_node *)m-private; + struct drm_mm *mm = (struct drm_mm *)node-info_ent-data; + struct drm_mm_node *entry; + int total_used = 0, total_free = 0, total = 0; + spin_lock(mm-unused_lock); This is not correct. The mm::unused_lock is there only to protect the list of cached drm_mm_node allocations that we use instead of kmalloc() when atomic. Instead the lock the user uses to protect the mm:s must be taken. In the TTM case IIRC its the bo_glob::lru_lock. Is it safe to use seq_printf() from within a spinlocked region? Good point, this was one of those quick hacks to have a look at fragmentation so I sorta guessed at the lock, I'd probably be best not locking anything, but I'll try and add a driver layer before drm_mm to do the correct locking, though as its debugging info even inconsistent is better than none. Yes, but you might end up traversing the list in the middle of a list pointer modification, which is bad. I'll fix it up next week and send v3, thanks again. Dave. /Thomas -- Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july -- ___ Dri-devel mailing list Dri-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dri-devel
[PATCH] drm/mm: add ability to dump mm lists via debugfs (v2)
From: Dave Airlie airl...@linux.ie This adds code to the drm_mm to talk to debugfs, and adds support to radeon to add the VRAM and GTT mm lists to debugfs. changes since v1: don't bother with free list just add used/free to main list add totals in pages Signed-off-by: Dave Airlie airl...@redhat.com --- drivers/gpu/drm/drm_mm.c| 25 ++ drivers/gpu/drm/radeon/radeon_ttm.c | 39 +++ include/drm/drm_mm.h|4 +++ 3 files changed, 68 insertions(+), 0 deletions(-) diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index 3e47869..a454e55 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c @@ -44,6 +44,7 @@ #include drmP.h #include drm_mm.h #include linux/slab.h +#include linux/seq_file.h #define MM_UNUSED_TARGET 4 @@ -370,3 +371,27 @@ void drm_mm_takedown(struct drm_mm * mm) BUG_ON(mm-num_unused != 0); } EXPORT_SYMBOL(drm_mm_takedown); + +#if defined(CONFIG_DEBUG_FS) +int drm_mm_dump_table(struct seq_file *m, void *data) +{ + struct drm_info_node *node = (struct drm_info_node *)m-private; + struct drm_mm *mm = (struct drm_mm *)node-info_ent-data; + struct drm_mm_node *entry; + int total_used = 0, total_free = 0, total = 0; + spin_lock(mm-unused_lock); + + list_for_each_entry(entry, mm-ml_entry, ml_entry) { + seq_printf(m, 0x%08lx-0x%08lx: 0x%08lx: %s\n, entry-start, entry-start+entry-size, entry-size, entry-free ? free : used); + total += entry-size; + if (entry-free) + total_free += entry-size; + else + total_used += entry-size; + } + seq_printf(m,total: %d, used %d free %d\n, total, total_free, total_used); + spin_unlock(mm-unused_lock); + return 0; +} +EXPORT_SYMBOL(drm_mm_dump_table); +#endif diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 0a85e7b..aaa1ebd 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c @@ -40,6 +40,8 @@ #define DRM_FILE_PAGE_OFFSET (0x1ULL PAGE_SHIFT) +static int radeon_ttm_debugfs_init(struct radeon_device *rdev); + static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev) { struct radeon_mman *mman; @@ -504,6 +506,12 @@ int radeon_ttm_init(struct radeon_device *rdev) if (unlikely(rdev-mman.bdev.dev_mapping == NULL)) { rdev-mman.bdev.dev_mapping = rdev-ddev-dev_mapping; } + + r = radeon_ttm_debugfs_init(rdev); + if (r) { + DRM_ERROR(Failed to init debugfs\n); + return r; + } return 0; } @@ -678,3 +686,34 @@ struct ttm_backend *radeon_ttm_backend_create(struct radeon_device *rdev) gtt-bound = false; return gtt-backend; } + +#define RADEON_DEBUGFS_MEM_TYPES 2 + +static struct drm_info_list radeon_mem_types_list[RADEON_DEBUGFS_MEM_TYPES]; +static char radeon_mem_types_names[RADEON_DEBUGFS_MEM_TYPES][32]; + +static int radeon_ttm_debugfs_init(struct radeon_device *rdev) +{ +#if defined(CONFIG_DEBUG_FS) + unsigned i; + + + for (i = 0; i RADEON_DEBUGFS_MEM_TYPES; i++) { + if (i == 0) + sprintf(radeon_mem_types_names[i], radeon_vram_mm); + else + sprintf(radeon_mem_types_names[i], radeon_gtt_mm); + radeon_mem_types_list[i].name = radeon_mem_types_names[i]; + radeon_mem_types_list[i].show = drm_mm_dump_table; + radeon_mem_types_list[i].driver_features = 0; + if (i == 0) + radeon_mem_types_list[i].data = rdev-mman.bdev.man[TTM_PL_VRAM].manager; + else + radeon_mem_types_list[i].data = rdev-mman.bdev.man[TTM_PL_TT].manager; + + } + return radeon_debugfs_add_files(rdev, radeon_mem_types_list, RADEON_DEBUGFS_MEM_TYPES); + +#endif + return 0; +} diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index f833207..7055014 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h @@ -96,4 +96,8 @@ static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) return block-mm; } +#ifdef CONFIG_DEBUG_FS +int drm_mm_dump_table(struct seq_file *m, void *data); +#endif + #endif -- 1.6.4 -- Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july -- ___ Dri-devel mailing list Dri-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dri-devel