[PATCH v5 3/5] drm: add debugfs support on per client-id basis

Khatri, Sunil sukhatri at amd.com
Thu Jun 26 13:40:34 UTC 2025


On 6/26/2025 7:07 PM, Tvrtko Ursulin wrote:
>
> On 24/06/2025 12: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.khatri at 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);
>> +    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);
>>         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)
>> +{
>> +}
>
> You forgot static inline for these two.

Thanks for catching that up. Will update.

Regards
Sunil

>
> Regards,
>
> Tvrtko
>
>>   #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;
>>   };
>>     /**
>


More information about the dri-devel mailing list