X-Git-Url: http://git.liburcu.org/?p=lttng-modules.git;a=blobdiff_plain;f=wrapper%2Ftimer.h;h=4fc9828c4279fa2e25b78e553e80b208b110c2fb;hp=c1c0c9526942fcadec87e9a11949b68fe47a56fd;hb=df93abe8f183251659200d95429dc67e8cfe8e4a;hpb=8e3b6653bf5bc3f64a6bc50d2fdce57ea5bbd4e8 diff --git a/wrapper/timer.h b/wrapper/timer.h index c1c0c952..4fc9828c 100644 --- a/wrapper/timer.h +++ b/wrapper/timer.h @@ -27,30 +27,76 @@ #include #include +/* + * In the olden days, pinned timers were initialized normaly with init_timer() + * and then modified with mod_timer_pinned(). + * + * Then came kernel 4.8.0 and they had to be initilized as pinned with + * init_timer_pinned() and then modified as regular timers with mod_timer(). + * + * Then came kernel 4.15.0 with a new timer API where init_timer() is no more. + * It's replaced by timer_setup() where pinned is now part of timer flags. + */ + + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0)) + +#define LTTNG_TIMER_PINNED TIMER_PINNED +#define LTTNG_TIMER_FUNC_ARG_TYPE struct timer_list * + +#define lttng_mod_timer_pinned(timer, expires) \ + mod_timer(timer, expires) + +#define lttng_from_timer(var, callback_timer, timer_fieldname) \ + from_timer(var, callback_timer, timer_fieldname) + +#define lttng_timer_setup(timer, callback, flags, unused) \ + timer_setup(timer, callback, flags) + -#if (LTTNG_RT_VERSION_CODE >= LTTNG_RT_KERNEL_VERSION(4,6,4,8) \ +#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) */ + + +# if (LTTNG_RT_VERSION_CODE >= LTTNG_RT_KERNEL_VERSION(4,6,4,8) \ || LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0)) -#define lttng_init_timer_pinned(timer) \ +#define lttng_init_timer_pinned(timer) \ init_timer_pinned(timer) -static inline int lttng_mod_timer_pinned(struct timer_list *timer, - unsigned long expires) -{ - return mod_timer(timer, expires); -} +#define lttng_mod_timer_pinned(timer, expires) \ + mod_timer(timer, expires) -#else +# else /* LTTNG_RT_VERSION_CODE >= LTTNG_RT_KERNEL_VERSION(4,6,4,8) */ -#define lttng_init_timer_pinned(timer) \ +#define lttng_init_timer_pinned(timer) \ init_timer(timer) -static inline int lttng_mod_timer_pinned(struct timer_list *timer, - unsigned long expires) +#define lttng_mod_timer_pinned(timer, expires) \ + mod_timer_pinned(timer, expires) + +# endif /* LTTNG_RT_VERSION_CODE >= LTTNG_RT_KERNEL_VERSION(4,6,4,8) */ + + +#define LTTNG_TIMER_PINNED TIMER_PINNED +#define LTTNG_TIMER_FUNC_ARG_TYPE unsigned long + +/* timer_fieldname is unused prior to 4.15. */ +#define lttng_from_timer(var, timer_data, timer_fieldname) \ + ((typeof(var))timer_data) + +static inline void lttng_timer_setup(struct timer_list *timer, + void (*function)(LTTNG_TIMER_FUNC_ARG_TYPE), + unsigned int flags, void *data) { - return mod_timer_pinned(timer, expires); + if (flags & LTTNG_TIMER_PINNED) + lttng_init_timer_pinned(timer); + else + init_timer(timer); + + timer->function = function; + timer->data = (unsigned long)data; } -#endif +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) */ #endif /* _LTTNG_WRAPPER_TIMER_H */