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. 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); > -- Jani Nikula, Intel