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. 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);