Message ID | 1505082197-11962-1-git-send-email-jasmin@anw.at (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 --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 */