On 6/16/2025 5:41 PM, Christian König wrote:
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.
root node above is needed in the drm_file.c function drm_alloc and there is nothing above drm_device where i can get the root information. that is the reason i mentioned it as drm_debugfs_root as root node of the drm subsystem itself.
~Sunil

  }
/**
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.

Thats a good suggestion and doable. Will update in next version

~Sunil


+       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
Sure, let me try that and push another patch.

        /* 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

Sure, let me try that if there are not challenges.

~sunil


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