On 26.06.25 15:48, Khatri, Sunil wrote: > > On 6/26/2025 5:34 PM, Christian König wrote: >> On 24.06.25 13:34, 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 | 26 ++++++++++++++++++++++++++ >>> drivers/gpu/drm/drm_file.c | 6 ++++++ >>> include/drm/drm_debugfs.h | 11 +++++++++++ >>> include/drm/drm_file.h | 7 +++++++ >>> 4 files changed, 50 insertions(+) >>> >>> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c >>> index a227903c29c4..ebdf60665b86 100644 >>> --- a/drivers/gpu/drm/drm_debugfs.c >>> +++ b/drivers/gpu/drm/drm_debugfs.c >>> @@ -309,6 +309,32 @@ void drm_debugfs_remove_accel_root(void) >>> debugfs_remove(accel_debugfs_root); >>> } >>> >>> +void drm_debugfs_clients_add(struct drm_file *file) >>> +{ >>> + char *client; >>> + >>> + client = kasprintf(GFP_KERNEL, "client-%llu", file->client_id); >>> + if (!client) >>> + return; >>> + >>> + /* Create a debugfs directory for the client in root on drm debugfs */ >>> + file->debugfs_client = debugfs_create_dir(client, drm_debugfs_root); >>> + kfree(client); >>> + >>> + client = kasprintf(GFP_KERNEL, "../%s", file->minor->dev->unique); >>> + if (!client) >>> + return; >>> + >>> + /* Create a link from client_id to the drm device this client id >>> belongs to */ >>> + debugfs_create_symlink("device", file->debugfs_client, client); >> Mhm, that won't work for accel devices. How should we fix that? > > All the clients we are creating is doing for the dri clients only and not for > accel driver, Since the root itself is different for accel it cant be in dri > and we could leave that for accel driver to take care if they need client > directory for something or this we could pick later if there is a need. > > In the mean while what we can do in the drm_alloc/drm_free is to add an extra > condition to check if (drm_core_check_feature(dev, DRIVER_COMPUTE_ACCEL)) or > not. and create and remove client onyl for !accel > if(!drm_core_check_feature(dev, DRIVER_COMPUTE_ACCEL)) > drm_debugfs_clients_add(file); and > if(!drm_core_check_feature(dev, DRIVER_COMPUTE_ACCEL)) > drm_debugfs_clients_remove(file);
Works for me. Regards, Christian. > > >>> + kfree(client); >>> +} >>> + >>> +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 >>> diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c >>> index 06ba6dcbf5ae..17b803ab119e 100644 >>> --- a/drivers/gpu/drm/drm_file.c >>> +++ b/drivers/gpu/drm/drm_file.c >>> @@ -45,6 +45,7 @@ >>> #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" >>> @@ -167,6 +168,8 @@ struct drm_file *drm_file_alloc(struct drm_minor *minor) >>> >>> drm_prime_init_file_private(&file->prime); >>> >>> + drm_debugfs_clients_add(file); >>> + >>> if (dev->driver->open) { >>> ret = dev->driver->open(dev, file); >>> if (ret < 0) >>> @@ -181,6 +184,8 @@ struct drm_file *drm_file_alloc(struct drm_minor *minor) >>> drm_syncobj_release(file); >>> if (drm_core_check_feature(dev, DRIVER_GEM)) >>> drm_gem_release(dev, file); >>> + >>> + drm_debugfs_clients_remove(file); >>> put_pid(rcu_access_pointer(file->pid)); >>> kfree(file); >>> >>> @@ -236,6 +241,7 @@ void drm_file_free(struct drm_file *file) >>> atomic_read(&dev->open_count)); >>> >>> drm_events_release(file); >>> + drm_debugfs_clients_remove(file); >> That most likely needs to come even before releasing the events. > > Sure will move it before events_release. > > Regards > Sunil Khatri > >> Regards, >> Christian. >> >>> >>> 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..2b3767ad8f5d 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); >>> + >>> +void 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,14 @@ static inline int drm_debugfs_gpuva_info(struct >>> seq_file *m, >>> { >>> return 0; >>> } >>> + >>> +static void drm_debugfs_clients_add(struct drm_file *file) >>> +{ >>> +} >>> + >>> +static 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; >>> }; >>> >>> /**