On 6/18/25 15:47, 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 | 32 ++++++++++++++++++++++++++++++++ > drivers/gpu/drm/drm_file.c | 10 ++++++++++ > include/drm/drm_debugfs.h | 12 ++++++++++++ > include/drm/drm_file.h | 7 +++++++ > 4 files changed, 61 insertions(+) > > diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c > index 5a33ec299c04..875276d5fb9f 100644 > --- a/drivers/gpu/drm/drm_debugfs.c > +++ b/drivers/gpu/drm/drm_debugfs.c > @@ -298,6 +298,38 @@ void drm_debugfs_remove_dir(void) > debugfs_remove(drm_debugfs_root); > } > > +int drm_debugfs_clients_add(struct drm_file *file) > +{ > + struct drm_device *dev; > + char *client_dir, *symlink; > + > + dev = file->minor->dev; > + > + client_dir = kasprintf(GFP_KERNEL, "client-%llu", file->client_id); > + if (!client_dir) > + return -ENOMEM; > + > + /* Create a debugfs directory for the client in root on drm debugfs */
That comments on what is done, so probably not a good idea. But we should certainly have some explanation why we do this! Probably best to add some overview under Documentation/gpu. Apart from that this works technically for me. Regards, Christian. > + file->debugfs_client = debugfs_create_dir(client_dir, drm_debugfs_root); > + kfree(client_dir); > + > + symlink = kasprintf(GFP_KERNEL, "../%s", dev->unique); > + if (!symlink) > + return -ENOMEM; > + > + /* Create a link from client_id to the drm device this client id > belongs to */ > + debugfs_create_symlink("device", file->debugfs_client, symlink); > + kfree(symlink); > + > + return 0; > +} > + > +void drm_debugfs_clients_remove(struct drm_file *file) > +{ > + debugfs_remove_recursive(file->debugfs_client); > + file->debugfs_client = NULL; > +} > + > /** > * drm_debugfs_dev_init - create debugfs directory for the device > * @dev: the device which we want to create the directory for > diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c > index 06ba6dcbf5ae..8502c5a630b1 100644 > --- a/drivers/gpu/drm/drm_file.c > +++ b/drivers/gpu/drm/drm_file.c > @@ -39,12 +39,14 @@ > #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> > #include <drm/drm_file.h> > #include <drm/drm_gem.h> > #include <drm/drm_print.h> > +#include <drm/drm_debugfs.h> > > #include "drm_crtc_internal.h" > #include "drm_internal.h" > @@ -143,6 +145,13 @@ struct drm_file *drm_file_alloc(struct drm_minor *minor) > rcu_assign_pointer(file->pid, get_pid(task_tgid(current))); > file->minor = minor; > > + ret = drm_debugfs_clients_add(file); > + if (ret) { > + put_pid(rcu_access_pointer(file->pid)); > + kfree(file); > + return ERR_PTR(ret); > + } > + > /* for compatibility root is always authenticated */ > file->authenticated = capable(CAP_SYS_ADMIN); > > @@ -236,6 +245,7 @@ void drm_file_free(struct drm_file *file) > atomic_read(&dev->open_count)); > > drm_events_release(file); > + drm_debugfs_clients_remove(file); > > if (drm_core_check_feature(dev, DRIVER_MODESET)) { > drm_fb_release(file); > diff --git a/include/drm/drm_debugfs.h b/include/drm/drm_debugfs.h > index cf06cee4343f..4bd6cc1d0900 100644 > --- a/include/drm/drm_debugfs.h > +++ b/include/drm/drm_debugfs.h > @@ -153,6 +153,9 @@ void drm_debugfs_add_files(struct drm_device *dev, > > int drm_debugfs_gpuva_info(struct seq_file *m, > struct drm_gpuvm *gpuvm); > + > +int drm_debugfs_clients_add(struct drm_file *file); > +void drm_debugfs_clients_remove(struct drm_file *file); > #else > static inline void drm_debugfs_create_files(const struct drm_info_list > *files, > int count, struct dentry *root, > @@ -181,6 +184,15 @@ static inline int drm_debugfs_gpuva_info(struct seq_file > *m, > { > return 0; > } > + > +int drm_debugfs_clients_add(struct drm_file *file) > +{ > + return 0; > +} > + > +void drm_debugfs_clients_remove(struct drm_file *file) > +{ > +} > #endif > > #endif /* _DRM_DEBUGFS_H_ */ > 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; > }; > > /**