Am 17.04.25 um 13:07 schrieb Jani Nikula: > On Thu, 17 Apr 2025, Christian König <christian.koe...@amd.com> wrote: >> Am 17.04.25 um 11:35 schrieb Jani Nikula: >>> On Thu, 17 Apr 2025, Sunil Khatri <sunil.kha...@amd.com> wrote: >>>> Add a drm helper macro which append the process information for >>>> the drm_file over drm_err. >>>> >>>> v5: change to macro from function (Christian Koenig) >>>> add helper functions for lock/unlock (Christian Koenig) >>>> >>>> v6: remove __maybe_unused and make function inline (Jani Nikula) >>>> remove drm_print.h >>> I guess I gave all kinds of comments, but in the end my conclusion was: >>> why does *any* of this have to be static inline or macros? Make >>> drm_file_err() a regular function and hide the implementation inside >>> drm_file.c. That's the cleanest approach IMO. >> That won't work. The macro is necessary to concatenate the format strings. > I think you can handle them using struct va_format and %pV.
Oh, really good point! I wasn't aware that this functionality exists. Going to discuss that with Sunil internally. Thanks, Christian. > > BR, > Jani. > > >> But the drm_task_lock() and drm_task_unlock() functions shouldn't be in the >> header. Those can be perfectly in drm_file.c or drm_print.c >> >> And we should put drm_file_err into drm_print.h instead of drm_file.h as far >> as I can see. >> >> Regards, >> Christian. >> >>> BR, >>> Jani. >>> >>>> Signed-off-by: Sunil Khatri <sunil.kha...@amd.com> >>>> --- >>>> include/drm/drm_file.h | 37 +++++++++++++++++++++++++++++++++++++ >>>> 1 file changed, 37 insertions(+) >>>> >>>> diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h >>>> index 94d365b22505..856b38e996c7 100644 >>>> --- a/include/drm/drm_file.h >>>> +++ b/include/drm/drm_file.h >>>> @@ -446,6 +446,43 @@ static inline bool drm_is_accel_client(const struct >>>> drm_file *file_priv) >>>> return file_priv->minor->type == DRM_MINOR_ACCEL; >>>> } >>>> >>>> +static inline struct task_struct *drm_task_lock(struct drm_file >>>> *file_priv) >>>> +{ >>>> + struct task_struct *task; >>>> + struct pid *pid; >>>> + >>>> + mutex_lock(&file_priv->client_name_lock); >>>> + rcu_read_lock(); >>>> + pid = rcu_dereference(file_priv->pid); >>>> + task = pid_task(pid, PIDTYPE_TGID); >>>> + return task; >>>> +} >>>> + >>>> +static inline void drm_task_unlock(struct drm_file *file_priv) >>>> +{ >>>> + rcu_read_unlock(); >>>> + mutex_unlock(&file_priv->client_name_lock); >>>> +} >>>> +/** >>>> + * drm_file_err - Fill info string with process name and pid >>>> + * @file_priv: context of interest for process name and pid >>>> + * @fmt: prinf() like format string >>>> + * >>>> + * This update the user provided buffer with process >>>> + * name and pid information for @file_priv >>>> + */ >>>> +#define drm_file_err(file_priv, fmt, ...) >>>> \ >>>> + do { >>>> \ >>>> + struct task_struct *task; >>>> \ >>>> + struct drm_device *dev = file_priv->minor->dev; >>>> \ >>>> + >>>> \ >>>> + task = drm_task_lock(file_priv); >>>> \ >>>> + drm_err(dev, "comm: %s pid: %d client: %s " fmt, >>>> \ >>>> + task ? task->comm : "", task ? task->pid : 0, >>>> \ >>>> + file_priv->client_name ?: "Unset", ##__VA_ARGS__); >>>> \ >>>> + drm_task_unlock(file_priv); >>>> \ >>>> + } while (0) >>>> + >>>> void drm_file_update_pid(struct drm_file *); >>>> >>>> struct drm_minor *drm_minor_acquire(struct xarray *minors_xa, unsigned >>>> int minor_id);