[PATCH 3/5] drm/debugfs: rework debugfs directory creation v4
Tomer Tayar
ttayar at habana.ai
Wed Jul 12 17:37:44 UTC 2023
On 11/07/2023 17:04, Christian König wrote:
> Instead of the per minor directories only create a single debugfs
> directory for the whole device directly when the device is initialized.
>
> For DRM devices each minor gets a symlink to the per device directory
> for now until we can be sure that this isn't useful any more in any way.
>
> Accel devices create only the per device directory and also drops the mid
> layer callback to create driver specific files.
>
> v2: cleanup accel component as well
> v3: fix typo when debugfs is disabled
> v4: call drm_debugfs_dev_fini() during release as well,
> some kerneldoc typos fixed
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/accel/drm_accel.c | 27 +++++++----
> drivers/gpu/drm/drm_atomic.c | 4 +-
> drivers/gpu/drm/drm_client.c | 4 +-
> drivers/gpu/drm/drm_crtc_internal.h | 2 +-
> drivers/gpu/drm/drm_debugfs.c | 73 ++++++++++++++++++++---------
> drivers/gpu/drm/drm_drv.c | 21 +++++++--
> drivers/gpu/drm/drm_framebuffer.c | 4 +-
> drivers/gpu/drm/drm_internal.h | 20 ++++++--
> include/drm/drm_accel.h | 9 +++-
> include/drm/drm_client.h | 2 +-
> include/drm/drm_device.h | 7 +++
> include/drm/drm_drv.h | 8 ++++
> include/drm/drm_file.h | 1 +
> 13 files changed, 130 insertions(+), 52 deletions(-)
>
> diff --git a/drivers/accel/drm_accel.c b/drivers/accel/drm_accel.c
> index 01edf2c00b5a..82c5fcbbc164 100644
> --- a/drivers/accel/drm_accel.c
> +++ b/drivers/accel/drm_accel.c
> @@ -79,26 +79,33 @@ static const struct drm_info_list accel_debugfs_list[] = {
> #define ACCEL_DEBUGFS_ENTRIES ARRAY_SIZE(accel_debugfs_list)
>
> /**
> - * accel_debugfs_init() - Initialize debugfs for accel minor
> + * accel_debugfs_init() - Initialize debugfs for device
> + * @dev: Pointer to the device instance.
> + *
> + * This function creates a root directory for the device in debugfs.
> + */
> +void accel_debugfs_init(struct drm_device *dev)
> +{
> + drm_debugfs_dev_init(dev, accel_debugfs_root);
> +}
> +
> +/**
> + * accel_debugfs_register() - Register debugfs for device
> * @minor: Pointer to the drm_minor instance.
> * @minor_id: The minor's id
Sorry that I missed that in the previous review, but 'minor' and
'minor_id' should be replaced with 'dev'.
Thanks,
Tomer
> *
> - * This function initializes the drm minor's debugfs members and creates
> - * a root directory for the minor in debugfs. It also creates common files
> - * for accelerators and calls the driver's debugfs init callback.
> + * Creates common files for accelerators.
> */
> -void accel_debugfs_init(struct drm_minor *minor, int minor_id)
> +void accel_debugfs_register(struct drm_device *dev)
> {
> - struct drm_device *dev = minor->dev;
> - char name[64];
> + struct drm_minor *minor = dev->accel;
>
> INIT_LIST_HEAD(&minor->debugfs_list);
> mutex_init(&minor->debugfs_lock);
> - sprintf(name, "%d", minor_id);
> - minor->debugfs_root = debugfs_create_dir(name, accel_debugfs_root);
> + minor->debugfs_root = dev->debugfs_root;
>
> drm_debugfs_create_files(accel_debugfs_list, ACCEL_DEBUGFS_ENTRIES,
> - minor->debugfs_root, minor);
> + dev->debugfs_root, minor);
> }
>
> /**
> diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> index 2c454568a607..affce6a8851f 100644
> --- a/drivers/gpu/drm/drm_atomic.c
> +++ b/drivers/gpu/drm/drm_atomic.c
> @@ -1832,9 +1832,9 @@ static const struct drm_debugfs_info drm_atomic_debugfs_list[] = {
> {"state", drm_state_info, 0},
> };
>
> -void drm_atomic_debugfs_init(struct drm_minor *minor)
> +void drm_atomic_debugfs_init(struct drm_device *dev)
> {
> - drm_debugfs_add_files(minor->dev, drm_atomic_debugfs_list,
> + drm_debugfs_add_files(dev, drm_atomic_debugfs_list,
> ARRAY_SIZE(drm_atomic_debugfs_list));
> }
> #endif
> diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
> index f6292ba0e6fc..a91132276f21 100644
> --- a/drivers/gpu/drm/drm_client.c
> +++ b/drivers/gpu/drm/drm_client.c
> @@ -514,9 +514,9 @@ static const struct drm_debugfs_info drm_client_debugfs_list[] = {
> { "internal_clients", drm_client_debugfs_internal_clients, 0 },
> };
>
> -void drm_client_debugfs_init(struct drm_minor *minor)
> +void drm_client_debugfs_init(struct drm_device *dev)
> {
> - drm_debugfs_add_files(minor->dev, drm_client_debugfs_list,
> + drm_debugfs_add_files(dev, drm_client_debugfs_list,
> ARRAY_SIZE(drm_client_debugfs_list));
> }
> #endif
> diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h
> index 501a10edd0e1..8556c3b3ff88 100644
> --- a/drivers/gpu/drm/drm_crtc_internal.h
> +++ b/drivers/gpu/drm/drm_crtc_internal.h
> @@ -232,7 +232,7 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
> /* drm_atomic.c */
> #ifdef CONFIG_DEBUG_FS
> struct drm_minor;
> -void drm_atomic_debugfs_init(struct drm_minor *minor);
> +void drm_atomic_debugfs_init(struct drm_device *dev);
> #endif
>
> int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> index 796cda62ad12..65b6e0aae96e 100644
> --- a/drivers/gpu/drm/drm_debugfs.c
> +++ b/drivers/gpu/drm/drm_debugfs.c
> @@ -225,8 +225,44 @@ void drm_debugfs_create_files(const struct drm_info_list *files, int count,
> }
> EXPORT_SYMBOL(drm_debugfs_create_files);
>
> -int drm_debugfs_init(struct drm_minor *minor, int minor_id,
> - struct dentry *root)
> +/**
> + * drm_debugfs_dev_init - create debugfs directory for the device
> + * @dev: the device which we want to create the directory for
> + * @root: the parent directory depending on the device type
> + *
> + * Creates the debugfs directory for the device under the given root directory.
> + */
> +void drm_debugfs_dev_init(struct drm_device *dev, struct dentry *root)
> +{
> + dev->debugfs_root = debugfs_create_dir(dev->unique, root);
> +}
> +
> +/**
> + * drm_debugfs_dev_fini - cleanup debugfs directory
> + * @dev: the device to cleanup the debugfs stuff
> + *
> + * Remove the debugfs directory, might be called multiple times.
> + */
> +void drm_debugfs_dev_fini(struct drm_device *dev)
> +{
> + debugfs_remove_recursive(dev->debugfs_root);
> + dev->debugfs_root = NULL;
> +}
> +
> +void drm_debugfs_dev_register(struct drm_device *dev)
> +{
> + drm_debugfs_add_files(dev, drm_debugfs_list, DRM_DEBUGFS_ENTRIES);
> +
> + if (drm_core_check_feature(dev, DRIVER_MODESET)) {
> + drm_framebuffer_debugfs_init(dev);
> + drm_client_debugfs_init(dev);
> + }
> + if (drm_drv_uses_atomic_modeset(dev))
> + drm_atomic_debugfs_init(dev);
> +}
> +
> +int drm_debugfs_register(struct drm_minor *minor, int minor_id,
> + struct dentry *root)
> {
> struct drm_device *dev = minor->dev;
> struct drm_debugfs_entry *entry, *tmp;
> @@ -235,19 +271,11 @@ int drm_debugfs_init(struct drm_minor *minor, int minor_id,
> INIT_LIST_HEAD(&minor->debugfs_list);
> mutex_init(&minor->debugfs_lock);
> sprintf(name, "%d", minor_id);
> - minor->debugfs_root = debugfs_create_dir(name, root);
> -
> - drm_debugfs_add_files(minor->dev, drm_debugfs_list, DRM_DEBUGFS_ENTRIES);
> + minor->debugfs_symlink = debugfs_create_symlink(name, root,
> + dev->unique);
>
> - if (drm_drv_uses_atomic_modeset(dev)) {
> - drm_atomic_debugfs_init(minor);
> - }
> -
> - if (drm_core_check_feature(dev, DRIVER_MODESET)) {
> - drm_framebuffer_debugfs_init(minor);
> -
> - drm_client_debugfs_init(minor);
> - }
> + /* TODO: Only for compatibility with drivers */
> + minor->debugfs_root = dev->debugfs_root;
>
> if (dev->driver->debugfs_init && dev->render != minor)
> dev->driver->debugfs_init(minor);
> @@ -314,13 +342,12 @@ static void drm_debugfs_remove_all_files(struct drm_minor *minor)
>
> void drm_debugfs_cleanup(struct drm_minor *minor)
> {
> - if (!minor->debugfs_root)
> + if (!minor->debugfs_symlink)
> return;
>
> drm_debugfs_remove_all_files(minor);
> -
> - debugfs_remove_recursive(minor->debugfs_root);
> - minor->debugfs_root = NULL;
> + debugfs_remove(minor->debugfs_symlink);
> + minor->debugfs_symlink = NULL;
> }
>
> /**
> @@ -505,13 +532,13 @@ static const struct file_operations drm_connector_fops = {
>
> void drm_debugfs_connector_add(struct drm_connector *connector)
> {
> - struct drm_minor *minor = connector->dev->primary;
> + struct drm_device *dev = connector->dev;
> struct dentry *root;
>
> - if (!minor->debugfs_root)
> + if (!dev->debugfs_root)
> return;
>
> - root = debugfs_create_dir(connector->name, minor->debugfs_root);
> + root = debugfs_create_dir(connector->name, dev->debugfs_root);
> connector->debugfs_entry = root;
>
> /* force */
> @@ -546,7 +573,7 @@ void drm_debugfs_connector_remove(struct drm_connector *connector)
>
> void drm_debugfs_crtc_add(struct drm_crtc *crtc)
> {
> - struct drm_minor *minor = crtc->dev->primary;
> + struct drm_device *dev = crtc->dev;
> struct dentry *root;
> char *name;
>
> @@ -554,7 +581,7 @@ void drm_debugfs_crtc_add(struct drm_crtc *crtc)
> if (!name)
> return;
>
> - root = debugfs_create_dir(name, minor->debugfs_root);
> + root = debugfs_create_dir(name, dev->debugfs_root);
> kfree(name);
>
> crtc->debugfs_entry = root;
> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
> index 12687dd9e1ac..25cbe02550e6 100644
> --- a/drivers/gpu/drm/drm_drv.c
> +++ b/drivers/gpu/drm/drm_drv.c
> @@ -172,10 +172,9 @@ static int drm_minor_register(struct drm_device *dev, unsigned int type)
> if (!minor)
> return 0;
>
> - if (minor->type == DRM_MINOR_ACCEL) {
> - accel_debugfs_init(minor, minor->index);
> - } else {
> - ret = drm_debugfs_init(minor, minor->index, drm_debugfs_root);
> + if (minor->type != DRM_MINOR_ACCEL) {
> + ret = drm_debugfs_register(minor, minor->index,
> + drm_debugfs_root);
> if (ret) {
> DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n");
> goto err_debugfs;
> @@ -697,6 +696,11 @@ static int drm_dev_init(struct drm_device *dev,
> goto err;
> }
>
> + if (drm_core_check_feature(dev, DRIVER_COMPUTE_ACCEL))
> + accel_debugfs_init(dev);
> + else
> + drm_debugfs_dev_init(dev, drm_debugfs_root);
> +
> return 0;
>
> err:
> @@ -786,6 +790,9 @@ static void drm_dev_release(struct kref *ref)
> {
> struct drm_device *dev = container_of(ref, struct drm_device, ref);
>
> + /* Just in case register/unregister was never called */
> + drm_debugfs_dev_fini(dev);
> +
> if (dev->driver->release)
> dev->driver->release(dev);
>
> @@ -916,6 +923,11 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags)
> if (drm_dev_needs_global_mutex(dev))
> mutex_lock(&drm_global_mutex);
>
> + if (drm_core_check_feature(dev, DRIVER_COMPUTE_ACCEL))
> + accel_debugfs_register(dev);
> + else
> + drm_debugfs_dev_register(dev);
> +
> ret = drm_minor_register(dev, DRM_MINOR_RENDER);
> if (ret)
> goto err_minors;
> @@ -1001,6 +1013,7 @@ void drm_dev_unregister(struct drm_device *dev)
> drm_minor_unregister(dev, DRM_MINOR_ACCEL);
> drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
> drm_minor_unregister(dev, DRM_MINOR_RENDER);
> + drm_debugfs_dev_fini(dev);
> }
> EXPORT_SYMBOL(drm_dev_unregister);
>
> diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
> index aff3746dedfb..ba51deb6d042 100644
> --- a/drivers/gpu/drm/drm_framebuffer.c
> +++ b/drivers/gpu/drm/drm_framebuffer.c
> @@ -1222,9 +1222,9 @@ static const struct drm_debugfs_info drm_framebuffer_debugfs_list[] = {
> { "framebuffer", drm_framebuffer_info, 0 },
> };
>
> -void drm_framebuffer_debugfs_init(struct drm_minor *minor)
> +void drm_framebuffer_debugfs_init(struct drm_device *dev)
> {
> - drm_debugfs_add_files(minor->dev, drm_framebuffer_debugfs_list,
> + drm_debugfs_add_files(dev, drm_framebuffer_debugfs_list,
> ARRAY_SIZE(drm_framebuffer_debugfs_list));
> }
> #endif
> diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
> index d7e023bbb0d5..bf4a4f24bd4c 100644
> --- a/drivers/gpu/drm/drm_internal.h
> +++ b/drivers/gpu/drm/drm_internal.h
> @@ -180,8 +180,10 @@ void drm_gem_vunmap(struct drm_gem_object *obj, struct iosys_map *map);
>
> /* drm_debugfs.c drm_debugfs_crc.c */
> #if defined(CONFIG_DEBUG_FS)
> -int drm_debugfs_init(struct drm_minor *minor, int minor_id,
> - struct dentry *root);
> +void drm_debugfs_dev_fini(struct drm_device *dev);
> +void drm_debugfs_dev_register(struct drm_device *dev);
> +int drm_debugfs_register(struct drm_minor *minor, int minor_id,
> + struct dentry *root);
> void drm_debugfs_cleanup(struct drm_minor *minor);
> void drm_debugfs_late_register(struct drm_device *dev);
> void drm_debugfs_connector_add(struct drm_connector *connector);
> @@ -190,8 +192,16 @@ void drm_debugfs_crtc_add(struct drm_crtc *crtc);
> void drm_debugfs_crtc_remove(struct drm_crtc *crtc);
> void drm_debugfs_crtc_crc_add(struct drm_crtc *crtc);
> #else
> -static inline int drm_debugfs_init(struct drm_minor *minor, int minor_id,
> - struct dentry *root)
> +static inline void drm_debugfs_dev_fini(struct drm_device *dev)
> +{
> +}
> +
> +static inline void drm_debugfs_dev_register(struct drm_device *dev)
> +{
> +}
> +
> +static inline int drm_debugfs_register(struct drm_minor *minor, int minor_id,
> + struct dentry *root)
> {
> return 0;
> }
> @@ -257,4 +267,4 @@ int drm_syncobj_query_ioctl(struct drm_device *dev, void *data,
> /* drm_framebuffer.c */
> void drm_framebuffer_print_info(struct drm_printer *p, unsigned int indent,
> const struct drm_framebuffer *fb);
> -void drm_framebuffer_debugfs_init(struct drm_minor *minor);
> +void drm_framebuffer_debugfs_init(struct drm_device *dev);
> diff --git a/include/drm/drm_accel.h b/include/drm/drm_accel.h
> index d4955062c77e..f4d3784b1dce 100644
> --- a/include/drm/drm_accel.h
> +++ b/include/drm/drm_accel.h
> @@ -58,7 +58,8 @@ int accel_minor_alloc(void);
> void accel_minor_replace(struct drm_minor *minor, int index);
> void accel_set_device_instance_params(struct device *kdev, int index);
> int accel_open(struct inode *inode, struct file *filp);
> -void accel_debugfs_init(struct drm_minor *minor, int minor_id);
> +void accel_debugfs_init(struct drm_device *dev);
> +void accel_debugfs_register(struct drm_device *dev);
>
> #else
>
> @@ -89,7 +90,11 @@ static inline void accel_set_device_instance_params(struct device *kdev, int ind
> {
> }
>
> -static inline void accel_debugfs_init(struct drm_minor *minor, int minor_id)
> +static inline void accel_debugfs_init(struct drm_device *dev)
> +{
> +}
> +
> +static inline void accel_debugfs_register(struct drm_device *dev)
> {
> }
>
> diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
> index c0a14b40c039..d47458ecdac4 100644
> --- a/include/drm/drm_client.h
> +++ b/include/drm/drm_client.h
> @@ -195,6 +195,6 @@ int drm_client_modeset_dpms(struct drm_client_dev *client, int mode);
> drm_for_each_connector_iter(connector, iter) \
> if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
>
> -void drm_client_debugfs_init(struct drm_minor *minor);
> +void drm_client_debugfs_init(struct drm_device *dev);
>
> #endif
> diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h
> index 7cf4afae2e79..3cf12b14232d 100644
> --- a/include/drm/drm_device.h
> +++ b/include/drm/drm_device.h
> @@ -311,6 +311,13 @@ struct drm_device {
> */
> struct drm_fb_helper *fb_helper;
>
> + /**
> + * @debugfs_root:
> + *
> + * Root directory for debugfs files.
> + */
> + struct dentry *debugfs_root;
> +
> /**
> * @debugfs_mutex:
> *
> diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h
> index b77f2c7275b7..22fdc2bb52b9 100644
> --- a/include/drm/drm_drv.h
> +++ b/include/drm/drm_drv.h
> @@ -575,4 +575,12 @@ static inline bool drm_firmware_drivers_only(void)
> return video_firmware_drivers_only();
> }
>
> +#if defined(CONFIG_DEBUG_FS)
> +void drm_debugfs_dev_init(struct drm_device *dev, struct dentry *root);
> +#else
> +static void drm_debugfs_dev_init(struct drm_device *dev, struct dentry *root)
> +{
> +}
> +#endif
> +
> #endif
> diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h
> index 966912053cb0..016fb715b9b6 100644
> --- a/include/drm/drm_file.h
> +++ b/include/drm/drm_file.h
> @@ -79,6 +79,7 @@ struct drm_minor {
> struct device *kdev; /* Linux device */
> struct drm_device *dev;
>
> + struct dentry *debugfs_symlink;
> struct dentry *debugfs_root;
>
> struct list_head debugfs_list;
More information about the dri-devel
mailing list