diff mbox

build: Added missing functions nsecs_to_jiffies(64)

Message ID 1505082197-11962-1-git-send-email-jasmin@anw.at (mailing list archive)
State New, archived
Headers show

Commit Message

Jasmin J. Sept. 10, 2017, 10:23 p.m. UTC
From: Jasmin Jessich <jasmin@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 <jasmin@anw.at>
---
 v4l/compat.h | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

Comments

Hans Verkuil Sept. 11, 2017, 1:57 p.m. UTC | #1
On 09/11/2017 12:23 AM, Jasmin J. wrote:
> From: Jasmin Jessich <jasmin@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 <jasmin@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 */
>
diff mbox

Patch

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)
+
+#endif
+
 #endif /*  _COMPAT_H */