On 6/16/25 12:05, Sunil Khatri wrote:
> add support to add a directory for each client-id
> with root at the dri level. Since the clients are
> unique and not just related to one single drm device,
> so it makes more sense to add all the client based
> nodes with root as dri.
> 
> Also create a symlink back to the parent drm device
> from each client.
> 
> Signed-off-by: Sunil Khatri <sunil.kha...@amd.com>
> ---
>  drivers/gpu/drm/drm_debugfs.c |  1 +
>  drivers/gpu/drm/drm_file.c    | 26 ++++++++++++++++++++++++++
>  include/drm/drm_device.h      |  4 ++++
>  include/drm/drm_file.h        |  7 +++++++
>  4 files changed, 38 insertions(+)
> 
> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> index 2d43bda82887..b4956960ae76 100644
> --- a/drivers/gpu/drm/drm_debugfs.c
> +++ b/drivers/gpu/drm/drm_debugfs.c
> @@ -296,6 +296,7 @@ EXPORT_SYMBOL(drm_debugfs_remove_files);
>  void drm_debugfs_dev_init(struct drm_device *dev, struct dentry *root)
>  {
>       dev->debugfs_root = debugfs_create_dir(dev->unique, root);
> +     dev->drm_debugfs_root = root;

We should probably just move drm_debugfs_root into drm_debugfs.c instead of 
keeping that around per device.

>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
> index 06ba6dcbf5ae..32012e39dcb4 100644
> --- a/drivers/gpu/drm/drm_file.c
> +++ b/drivers/gpu/drm/drm_file.c
> @@ -39,6 +39,7 @@
>  #include <linux/poll.h>
>  #include <linux/slab.h>
>  #include <linux/vga_switcheroo.h>
> +#include <linux/debugfs.h>
>  
>  #include <drm/drm_client_event.h>
>  #include <drm/drm_drv.h>
> @@ -133,6 +134,7 @@ struct drm_file *drm_file_alloc(struct drm_minor *minor)
>       struct drm_device *dev = minor->dev;
>       struct drm_file *file;
>       int ret;
> +     char *dir_name, *drm_name, *symlink;
>  
>       file = kzalloc(sizeof(*file), GFP_KERNEL);
>       if (!file)
> @@ -143,6 +145,27 @@ struct drm_file *drm_file_alloc(struct drm_minor *minor)
>       rcu_assign_pointer(file->pid, get_pid(task_tgid(current)));
>       file->minor = minor;
>  

> +     dir_name = kasprintf(GFP_KERNEL, "client-%llu", file->client_id);
> +     if (!dir_name)
> +             return ERR_PTR(-ENOMEM);
> +
> +     /* Create a debugfs directory for the client in root on drm debugfs */
> +     file->debugfs_client = debugfs_create_dir(dir_name, 
> dev->drm_debugfs_root);
> +     kfree(dir_name);
> +
> +     drm_name = kasprintf(GFP_KERNEL, "%d", minor->index);
> +     if (!drm_name)
> +             return ERR_PTR(-ENOMEM);
> +
> +     symlink = kasprintf(GFP_KERNEL, "../%d", minor->index);

Better use dev->unique here, minor->index is also only a symlink.

> +     if (!symlink)
> +             return ERR_PTR(-ENOMEM);
> +
> +     /* Create a link from client_id to the drm device this client id 
> belongs to */
> +     debugfs_create_symlink(drm_name, file->debugfs_client, symlink);
> +     kfree(drm_name);
> +     kfree(symlink);
> +

Move all that debugfs handling into a function in drm_debugfs.c

>       /* for compatibility root is always authenticated */
>       file->authenticated = capable(CAP_SYS_ADMIN);
>  
> @@ -237,6 +260,9 @@ void drm_file_free(struct drm_file *file)
>  
>       drm_events_release(file);
>  
> +     debugfs_remove_recursive(file->debugfs_client);
> +     file->debugfs_client = NULL;
> +

Same here, move to drm_debugfs.c

Apart from that looks solid to me.

Regards,
Christian.


>       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
>               drm_fb_release(file);
>               drm_property_destroy_user_blobs(dev, file);
> diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h
> index 6ea54a578cda..ec20b777b3cc 100644
> --- a/include/drm/drm_device.h
> +++ b/include/drm/drm_device.h
> @@ -325,6 +325,10 @@ struct drm_device {
>        * Root directory for debugfs files.
>        */
>       struct dentry *debugfs_root;
> +     /**
> +      * @drm_debugfs_root;
> +      */
> +     struct dentry *drm_debugfs_root;
>  };
>  
>  #endif
> diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h
> index 5c3b2aa3e69d..eab7546aad79 100644
> --- a/include/drm/drm_file.h
> +++ b/include/drm/drm_file.h
> @@ -400,6 +400,13 @@ struct drm_file {
>        * @client_name_lock: Protects @client_name.
>        */
>       struct mutex client_name_lock;
> +
> +     /**
> +      * @debugfs_client:
> +      *
> +      * debugfs directory for each client under a drm node.
> +      */
> +     struct dentry *debugfs_client;
>  };
>  
>  /**

Reply via email to