On 09/11/2017 12:23 AM, Jasmin J. wrote:
> From: Jasmin Jessich <jas...@anw.at>
> 
> Several modules expect the functions nsecs_to_jiffies64 and
> nsecs_to_jiffies to be available when they get loaded. For Kernels prior
> to 3.16, this symbol is not exported in time.c .
> Copied the functions to compat.h, so that they get already resolved during
> compilation. Define also a macro with a name conversion, because the
> mentioned functions are defined as extern in include/linux/jiffies.h,
> which gives an error when the are re-defined as static.
> 
> Signed-off-by: Jasmin Jessich <jas...@anw.at>
> ---
>  v4l/compat.h | 37 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 37 insertions(+)
> 
> diff --git a/v4l/compat.h b/v4l/compat.h
> index 7a49551..3dedf26 100644
> --- a/v4l/compat.h
> +++ b/v4l/compat.h
> @@ -2118,4 +2118,41 @@ static inline int pm_runtime_get_if_in_use(struct 
> device *dev)
>       .subvendor = (subvend), .subdevice = (subdev)
>  #endif
>  
> +
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)
> +/*
> + * copied from kernel/time/time.c
> + */
> +static inline u64 nsecs_to_jiffies64_static(u64 n)
> +{
> +#if (NSEC_PER_SEC % HZ) == 0
> +    /* Common case, HZ = 100, 128, 200, 250, 256, 500, 512, 1000 etc. */
> +    return div_u64(n, NSEC_PER_SEC / HZ);
> +#elif (HZ % 512) == 0
> +    /* overflow after 292 years if HZ = 1024 */
> +    return div_u64(n * HZ / 512, NSEC_PER_SEC / 512);
> +#else
> +    /*
> +     * Generic case - optimized for cases where HZ is a multiple of 3.
> +     * overflow after 64.99 years, exact for HZ = 60, 72, 90, 120 etc.
> +     */
> +    return div_u64(n * 9, (9ull * NSEC_PER_SEC + HZ / 2) / HZ);
> +#endif
> +}
> +
> +static inline unsigned long nsecs_to_jiffies_static(u64 n)
> +{
> +    return (unsigned long)nsecs_to_jiffies64_static(n);
> +}
> +
> +/*
> + * linux/jiffies.h defines nsecs_to_jiffies64 and nsecs_to_jiffies
> + * as externals. To get rid of the compiler error, we redefine the
> + * functions to the static variant just defined above.
> + */
> +#define nsecs_to_jiffies64(_n) nsecs_to_jiffies64_static(_n)
> +#define nsecs_to_jiffies(_n) nsecs_to_jiffies_static(_n)

For this to work reliably I think you should include jiffies.h before these
defines. If the defines come before the header is included I would expect
that the extern functions then become extern nsecs_to_jiffies64_static and
you will have the same problem again.

It is probably included already via another header, but it doesn't hurt to
be safe.

Looks good otherwise.

Regards,

        Hans

> +
> +#endif
> +
>  #endif /*  _COMPAT_H */
> 

Reply via email to