Am 23.01.2014 04:20, schrieb Ben Widawsky: > On Wed, Jan 22, 2014 at 11:11:10AM +0100, Christian K?nig wrote: >> Am 21.01.2014 21:33, schrieb Ben Widawsky: >>> The debugfs helper duplicates the functionality used by Armada, so let's >>> just use that. >>> >>> WARNING: only compile tested >>> >>> Cc: Christian K?nig <christian.koenig at amd.com> >>> Signed-off-by: Ben Widawsky <ben at bwidawsk.net> >>> --- >>> drivers/gpu/drm/radeon/radeon.h | 5 ----- >>> drivers/gpu/drm/radeon/radeon_ttm.c | 43 >>> ++++++++++++++++++++++--------------- >>> 2 files changed, 26 insertions(+), 22 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/radeon/radeon.h >>> b/drivers/gpu/drm/radeon/radeon.h >>> index c5519ca..ceec468 100644 >>> --- a/drivers/gpu/drm/radeon/radeon.h >>> +++ b/drivers/gpu/drm/radeon/radeon.h >>> @@ -418,11 +418,6 @@ struct radeon_mman { >>> struct ttm_bo_device bdev; >>> bool mem_global_referenced; >>> bool initialized; >>> - >>> -#if defined(CONFIG_DEBUG_FS) >>> - struct dentry *vram; >>> - struct dentry *gtt; >>> -#endif >>> }; >>> /* bo virtual address in a specific vm */ >>> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c >>> b/drivers/gpu/drm/radeon/radeon_ttm.c >>> index 77f5b0c..cf7caf2 100644 >>> --- a/drivers/gpu/drm/radeon/radeon_ttm.c >>> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c >>> @@ -971,27 +971,34 @@ static const struct file_operations >>> radeon_ttm_gtt_fops = { >>> .llseek = default_llseek >>> }; >>> +static const struct radeon_debugfs_files { >>> + const char *name; >>> + const struct file_operations *fops; >>> +} radeon_debugfs_files[] = { >>> + {"radeon_vram", &radeon_ttm_vram_fops}, >>> + {"radeon_gtt", &radeon_ttm_gtt_fops}, >>> +}; >>> #endif >>> static int radeon_ttm_debugfs_init(struct radeon_device *rdev) >>> { >>> #if defined(CONFIG_DEBUG_FS) >>> unsigned count; >>> + int i, ret; >>> struct drm_minor *minor = rdev->ddev->primary; >>> - struct dentry *ent, *root = minor->debugfs_root; >>> - >>> - ent = debugfs_create_file("radeon_vram", S_IFREG | S_IRUGO, root, >>> - rdev, &radeon_ttm_vram_fops); >>> - if (IS_ERR(ent)) >>> - return PTR_ERR(ent); >>> - rdev->mman.vram = ent; >>> - >>> - ent = debugfs_create_file("radeon_gtt", S_IFREG | S_IRUGO, root, >>> - rdev, &radeon_ttm_gtt_fops); >>> - if (IS_ERR(ent)) >>> - return PTR_ERR(ent); >>> - rdev->mman.gtt = ent; >>> + struct dentry *root = minor->debugfs_root; >>> + >>> + for (i = 0; i < ARRAY_SIZE(radeon_debugfs_files); i++) { >>> + ret = drm_debugfs_create_file(root, minor, >>> + radeon_debugfs_files[i].name, >>> + radeon_debugfs_files[i].fops, >>> + S_IFREG | S_IWUSR); >>> + if (ret) { >>> + radeon_ttm_debugfs_fini(rdev); >>> + return ret; >>> + } >>> + } >>> count = ARRAY_SIZE(radeon_ttm_debugfs_list); >>> @@ -1010,11 +1017,13 @@ static int radeon_ttm_debugfs_init(struct >>> radeon_device *rdev) >>> static void radeon_ttm_debugfs_fini(struct radeon_device *rdev) >>> { >>> #if defined(CONFIG_DEBUG_FS) >>> + int i; >>> - debugfs_remove(rdev->mman.vram); >>> - rdev->mman.vram = NULL; >>> + for (i = 0; i < ARRAY_SIZE(radeon_debugfs_files); i++) { >>> + struct drm_info_list *info_list = >>> + (struct drm_info_list *)&radeon_debugfs_files[i]; >>> - debugfs_remove(rdev->mman.gtt); >>> - rdev->mman.gtt = NULL; >>> + drm_debugfs_remove_files(info_list, 1, rdev->ddev->primary); >> This won't work correctly because info_ent doesn't contain this pointer but >> a pointer to the fops instead. > You are correct. It should have been &radeon_debugfs_files[i].fops. > >> Additional to that the fops might not be unique (you can use the same >> fops for different files) so they are probably not such a good choice >> as the key. > This is correct, and I elaborate a bit on this in a later patch (or > earlier, I forget). Essentially we have exactly one usage (afaict) of a > caller that wants a fops != key. I didn't want to create the interface > around this possibility, but rather let other extend it when it becomes > more common. > > However, if this is requested/required, what I would do is provide a > void *key argument, where a NULL value will result in using fops. > > >> On the other hand why do the drm layer want to do this bookkeeping of >> all the created files in the first place? We could just use >> debugfs_remove_recursive instead and don't need to mess with this at >> all. >> >> Regards, Christian. >> > The answer to the question predates me. I think having the helpers for > the common case, where you only want a show() function is handy. The > decision to split off and continue to shoehorn newer, more featured > debugfs files (as you have done in Radeon with these two, and as we have > done in i915 all over) was not one I made, nor one I really care to fix. > > So assuming I fix the bug, what do you want to me do?
If you want to clean it up then clean it up completely. The helper to add a debugfs file with only a show function should probably be a general debugfs feature instead of being part of DRM. So as long as nobody can come up with a good reason why DRM does this housekeeping of all created debugfs file I would say use debugfs_remove_recursive instead and kill the complete drm debugfs helpers. Christian. > >>> + } #endif } >>