On Tue, 15 Sep 2026, Maíra Canal <[email protected]> wrote:
> drm_timeout_abs_to_jiffies() began as a static helper inside the syncobj
> wait implementation and was later exported in place, so that it could be
> called by multiple drivers (e.g. panfrost, lima, tegra and accel
> drivers). All of them reach it through drm_utils.h.
>
> Give it a file of its own, so that timeout conversion helpers have a
> home, which will be useful when we add new timeout handlers. Also create
> a drm_timeout.h header to host all timeout-related helpers.
>
> No functional change.
>
> Reviewed-by: Tvrtko Ursulin <[email protected]>
> Signed-off-by: Maíra Canal <[email protected]>
> ---
>  drivers/accel/ethosu/ethosu_drv.c       |  2 +-
>  drivers/accel/ivpu/ivpu_gem.c           |  2 +-
>  drivers/accel/rocket/rocket_gem.c       |  2 +-
>  drivers/gpu/drm/Makefile                |  1 +
>  drivers/gpu/drm/drm_syncobj.c           | 35 +----------------------
>  drivers/gpu/drm/drm_timeout.c           | 50 
> +++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/lima/lima_gem.c         |  2 +-
>  drivers/gpu/drm/panfrost/panfrost_drv.c |  2 +-
>  drivers/gpu/drm/tegra/uapi.c            |  2 +-
>  drivers/gpu/drm/xe/xe_wait_user_fence.c |  2 +-
>  include/drm/drm_timeout.h               | 16 +++++++++++
>  include/drm/drm_utils.h                 |  2 --
>  12 files changed, 75 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/accel/ethosu/ethosu_drv.c 
> b/drivers/accel/ethosu/ethosu_drv.c
> index 1cf284e7f300..1ac08f09fde8 100644
> --- a/drivers/accel/ethosu/ethosu_drv.c
> +++ b/drivers/accel/ethosu/ethosu_drv.c
> @@ -12,10 +12,10 @@
>  
>  #include <drm/drm_drv.h>
>  #include <drm/drm_ioctl.h>
> -#include <drm/drm_utils.h>
>  #include <drm/drm_gem.h>
>  #include <drm/drm_accel.h>
>  #include <drm/drm_managed.h>
> +#include <drm/drm_timeout.h>
>  #include <drm/ethosu_accel.h>
>  
>  #include "ethosu_drv.h"
> diff --git a/drivers/accel/ivpu/ivpu_gem.c b/drivers/accel/ivpu/ivpu_gem.c
> index 4f2005a8d496..563eeffb5736 100644
> --- a/drivers/accel/ivpu/ivpu_gem.c
> +++ b/drivers/accel/ivpu/ivpu_gem.c
> @@ -12,7 +12,7 @@
>  #include <drm/drm_cache.h>
>  #include <drm/drm_debugfs.h>
>  #include <drm/drm_file.h>
> -#include <drm/drm_utils.h>
> +#include <drm/drm_timeout.h>
>  
>  #include "ivpu_drv.h"
>  #include "ivpu_fw.h"
> diff --git a/drivers/accel/rocket/rocket_gem.c 
> b/drivers/accel/rocket/rocket_gem.c
> index a5fffa51ff35..d981c6a93ff1 100644
> --- a/drivers/accel/rocket/rocket_gem.c
> +++ b/drivers/accel/rocket/rocket_gem.c
> @@ -3,7 +3,7 @@
>  
>  #include <drm/drm_device.h>
>  #include <drm/drm_print.h>
> -#include <drm/drm_utils.h>
> +#include <drm/drm_timeout.h>
>  #include <drm/rocket_accel.h>
>  #include <linux/dma-mapping.h>
>  #include <linux/iommu.h>
> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> index e635fcffd379..7283cf87880f 100644
> --- a/drivers/gpu/drm/Makefile
> +++ b/drivers/gpu/drm/Makefile
> @@ -68,6 +68,7 @@ drm-y := \
>       drm_rect.o \
>       drm_syncobj.o \
>       drm_sysfs.o \
> +     drm_timeout.o \
>       drm_trace_points.o \
>       drm_vblank.o \
>       drm_vblank_work.o \
> diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
> index c23a5de27eff..f1d4da168545 100644
> --- a/drivers/gpu/drm/drm_syncobj.c
> +++ b/drivers/gpu/drm/drm_syncobj.c
> @@ -208,7 +208,7 @@
>  #include <drm/drm_gem.h>
>  #include <drm/drm_print.h>
>  #include <drm/drm_syncobj.h>
> -#include <drm/drm_utils.h>
> +#include <drm/drm_timeout.h>
>  
>  #include "drm_internal.h"
>  
> @@ -1193,39 +1193,6 @@ static signed long 
> drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
>       return timeout;
>  }
>  
> -/**
> - * drm_timeout_abs_to_jiffies - calculate jiffies timeout from absolute value
> - *
> - * @timeout_nsec: timeout nsec component in ns, 0 for poll
> - *
> - * Calculate the timeout in jiffies from an absolute time in sec/nsec.
> - */
> -signed long drm_timeout_abs_to_jiffies(int64_t timeout_nsec)
> -{
> -     ktime_t abs_timeout, now;
> -     u64 timeout_ns, timeout_jiffies64;
> -
> -     /* make 0 timeout means poll - absolute 0 doesn't seem valid */
> -     if (timeout_nsec == 0)
> -             return 0;
> -
> -     abs_timeout = ns_to_ktime(timeout_nsec);
> -     now = ktime_get();
> -
> -     if (!ktime_after(abs_timeout, now))
> -             return 0;
> -
> -     timeout_ns = ktime_to_ns(ktime_sub(abs_timeout, now));
> -
> -     timeout_jiffies64 = nsecs_to_jiffies64(timeout_ns);
> -     /*  clamp timeout to avoid infinite timeout */
> -     if (timeout_jiffies64 >= MAX_SCHEDULE_TIMEOUT - 1)
> -             return MAX_SCHEDULE_TIMEOUT - 1;
> -
> -     return timeout_jiffies64 + 1;
> -}
> -EXPORT_SYMBOL(drm_timeout_abs_to_jiffies);
> -
>  static int drm_syncobj_array_wait(struct drm_device *dev,
>                                 struct drm_file *file_private,
>                                 struct drm_syncobj_wait *wait,
> diff --git a/drivers/gpu/drm/drm_timeout.c b/drivers/gpu/drm/drm_timeout.c
> new file mode 100644
> index 000000000000..35e10293e0a1
> --- /dev/null
> +++ b/drivers/gpu/drm/drm_timeout.c
> @@ -0,0 +1,50 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Timeout conversion helpers for wait ioctls.
> + *
> + * Copyright 2017 Red Hat
> + * Copyright 2016 Advanced Micro Devices, Inc.
> + */
> +
> +#include <linux/export.h>
> +#include <linux/jiffies.h>
> +#include <linux/ktime.h>
> +#include <linux/sched.h>
> +
> +#include <drm/drm_timeout.h>
> +
> +/**
> + * drm_timeout_abs_to_jiffies - calculate jiffies timeout from absolute value
> + * @timeout_nsec: timeout nsec component in ns, 0 for poll
> + *
> + * Calculate the timeout in jiffies from an absolute time in ns. The result 
> is
> + * clamped to MAX_SCHEDULE_TIMEOUT - 1 to avoid infinite timeouts.
> + *
> + * Returns:
> + * The number of jiffies until the given timeout, or the upper limit.
> + */
> +signed long drm_timeout_abs_to_jiffies(int64_t timeout_nsec)

The parameter type is different from the declaration, int64_t vs. s64. I
think s64 should be preferred.

But why is the *absolute* timeout being passed in possibly negative? And
why is the return value explicitly signed? I don't get it. Of course,
not introduced by this patch.

BR,
Jani.

> +{
> +     ktime_t abs_timeout, now;
> +     u64 timeout_ns, timeout_jiffies64;
> +
> +     /* make 0 timeout means poll - absolute 0 doesn't seem valid */
> +     if (timeout_nsec == 0)
> +             return 0;
> +
> +     abs_timeout = ns_to_ktime(timeout_nsec);
> +     now = ktime_get();
> +
> +     if (!ktime_after(abs_timeout, now))
> +             return 0;
> +
> +     timeout_ns = ktime_to_ns(ktime_sub(abs_timeout, now));
> +
> +     timeout_jiffies64 = nsecs_to_jiffies64(timeout_ns);
> +     /*  clamp timeout to avoid infinite timeout */
> +     if (timeout_jiffies64 >= MAX_SCHEDULE_TIMEOUT - 1)
> +             return MAX_SCHEDULE_TIMEOUT - 1;
> +
> +     return timeout_jiffies64 + 1;
> +}
> +EXPORT_SYMBOL(drm_timeout_abs_to_jiffies);
> diff --git a/drivers/gpu/drm/lima/lima_gem.c b/drivers/gpu/drm/lima/lima_gem.c
> index 0c73860bb501..97e1dc541c2e 100644
> --- a/drivers/gpu/drm/lima/lima_gem.c
> +++ b/drivers/gpu/drm/lima/lima_gem.c
> @@ -10,7 +10,7 @@
>  
>  #include <drm/drm_file.h>
>  #include <drm/drm_syncobj.h>
> -#include <drm/drm_utils.h>
> +#include <drm/drm_timeout.h>
>  
>  #include <drm/lima_drm.h>
>  
> diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c 
> b/drivers/gpu/drm/panfrost/panfrost_drv.c
> index 96a66d673ba6..70c05210ea84 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_drv.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
> @@ -18,7 +18,7 @@
>  #include <drm/drm_ioctl.h>
>  #include <drm/drm_print.h>
>  #include <drm/drm_syncobj.h>
> -#include <drm/drm_utils.h>
> +#include <drm/drm_timeout.h>
>  
>  #include "panfrost_device.h"
>  #include "panfrost_drv.h"
> diff --git a/drivers/gpu/drm/tegra/uapi.c b/drivers/gpu/drm/tegra/uapi.c
> index c0ac6b45f2d7..bee310b07eb0 100644
> --- a/drivers/gpu/drm/tegra/uapi.c
> +++ b/drivers/gpu/drm/tegra/uapi.c
> @@ -7,7 +7,7 @@
>  
>  #include <drm/drm_drv.h>
>  #include <drm/drm_file.h>
> -#include <drm/drm_utils.h>
> +#include <drm/drm_timeout.h>
>  
>  #include "drm.h"
>  #include "uapi.h"
> diff --git a/drivers/gpu/drm/xe/xe_wait_user_fence.c 
> b/drivers/gpu/drm/xe/xe_wait_user_fence.c
> index 51eb940ceb4e..e241f3ec3547 100644
> --- a/drivers/gpu/drm/xe/xe_wait_user_fence.c
> +++ b/drivers/gpu/drm/xe/xe_wait_user_fence.c
> @@ -7,7 +7,7 @@
>  
>  #include <drm/drm_device.h>
>  #include <drm/drm_file.h>
> -#include <drm/drm_utils.h>
> +#include <drm/drm_timeout.h>
>  #include <uapi/drm/xe_drm.h>
>  
>  #include "xe_device.h"
> diff --git a/include/drm/drm_timeout.h b/include/drm/drm_timeout.h
> new file mode 100644
> index 000000000000..cd9621c52062
> --- /dev/null
> +++ b/include/drm/drm_timeout.h
> @@ -0,0 +1,16 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Function prototypes for timeout conversion helpers for wait ioctls.
> + *
> + * Copyright 2017 Red Hat
> + * Copyright 2016 Advanced Micro Devices, Inc.
> + */
> +
> +#ifndef __DRM_TIMEOUT_H__
> +#define __DRM_TIMEOUT_H__
> +
> +#include <linux/types.h>
> +
> +signed long drm_timeout_abs_to_jiffies(s64 timeout_nsec);
> +
> +#endif
> diff --git a/include/drm/drm_utils.h b/include/drm/drm_utils.h
> index 7e077484c5bb..c61dee76451c 100644
> --- a/include/drm/drm_utils.h
> +++ b/include/drm/drm_utils.h
> @@ -25,6 +25,4 @@ struct drm_panel_backlight_quirk {
>  const struct drm_panel_backlight_quirk *
>  drm_get_panel_backlight_quirk(const struct drm_edid *edid);
>  
> -signed long drm_timeout_abs_to_jiffies(int64_t timeout_nsec);
> -
>  #endif

-- 
Jani Nikula, Intel

Reply via email to