On Wed, Jul 21, 2021 at 10:23:57AM -0500, Jason Ekstrand wrote: > We create a bunch of debugfs entries as a side-effect of > ttm_global_init() and then never clean them up. This isn't usually a > problem because we free the whole debugfs directory on module unload. > However, if the global reference count ever goes to zero and then > ttm_global_init() is called again, we'll re-create those debugfs entries > and debugfs will complain in dmesg that we're creating entries that > already exist. This patch fixes this problem by changing the lifetime > of the whole TTM debugfs directory to match that of the TTM global > state. > > Signed-off-by: Jason Ekstrand <jason@xxxxxxxxxxxxxx> > Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> I've pushed this to drm-misc-fixes since I think this entire slab debugfs story started with 5.15-rc1, so good to get it sorted there. -Daniel > --- > drivers/gpu/drm/ttm/ttm_device.c | 12 ++++++++++++ > drivers/gpu/drm/ttm/ttm_module.c | 16 ---------------- > 2 files changed, 12 insertions(+), 16 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_device.c b/drivers/gpu/drm/ttm/ttm_device.c > index 519deea8e39b7..74e3b460132b3 100644 > --- a/drivers/gpu/drm/ttm/ttm_device.c > +++ b/drivers/gpu/drm/ttm/ttm_device.c > @@ -44,6 +44,8 @@ static unsigned ttm_glob_use_count; > struct ttm_global ttm_glob; > EXPORT_SYMBOL(ttm_glob); > > +struct dentry *ttm_debugfs_root; > + > static void ttm_global_release(void) > { > struct ttm_global *glob = &ttm_glob; > @@ -53,6 +55,7 @@ static void ttm_global_release(void) > goto out; > > ttm_pool_mgr_fini(); > + debugfs_remove(ttm_debugfs_root); > > __free_page(glob->dummy_read_page); > memset(glob, 0, sizeof(*glob)); > @@ -73,6 +76,13 @@ static int ttm_global_init(void) > > si_meminfo(&si); > > + ttm_debugfs_root = debugfs_create_dir("ttm", NULL); > + if (IS_ERR(ttm_debugfs_root)) { > + ret = PTR_ERR(ttm_debugfs_root); > + ttm_debugfs_root = NULL; > + goto out; > + } > + > /* Limit the number of pages in the pool to about 50% of the total > * system memory. > */ > @@ -100,6 +110,8 @@ static int ttm_global_init(void) > debugfs_create_atomic_t("buffer_objects", 0444, ttm_debugfs_root, > &glob->bo_count); > out: > + if (ret && ttm_debugfs_root) > + debugfs_remove(ttm_debugfs_root); > if (ret) > --ttm_glob_use_count; > mutex_unlock(&ttm_global_mutex); > diff --git a/drivers/gpu/drm/ttm/ttm_module.c b/drivers/gpu/drm/ttm/ttm_module.c > index 997c458f68a9a..7fcdef278c742 100644 > --- a/drivers/gpu/drm/ttm/ttm_module.c > +++ b/drivers/gpu/drm/ttm/ttm_module.c > @@ -72,22 +72,6 @@ pgprot_t ttm_prot_from_caching(enum ttm_caching caching, pgprot_t tmp) > return tmp; > } > > -struct dentry *ttm_debugfs_root; > - > -static int __init ttm_init(void) > -{ > - ttm_debugfs_root = debugfs_create_dir("ttm", NULL); > - return 0; > -} > - > -static void __exit ttm_exit(void) > -{ > - debugfs_remove(ttm_debugfs_root); > -} > - > -module_init(ttm_init); > -module_exit(ttm_exit); > - > MODULE_AUTHOR("Thomas Hellstrom, Jerome Glisse"); > MODULE_DESCRIPTION("TTM memory manager subsystem (for DRM device)"); > MODULE_LICENSE("GPL and additional rights"); > -- > 2.31.1 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch