summaryrefslogtreecommitdiff
path: root/backport-include/linux/timer.h
diff options
context:
space:
mode:
Diffstat (limited to 'backport-include/linux/timer.h')
-rw-r--r--backport-include/linux/timer.h70
1 files changed, 70 insertions, 0 deletions
diff --git a/backport-include/linux/timer.h b/backport-include/linux/timer.h
new file mode 100644
index 0000000..69590bb
--- /dev/null
+++ b/backport-include/linux/timer.h
@@ -0,0 +1,70 @@
+#ifndef _BACKPORT_TIMER_H
+#define _BACKPORT_TIMER_H
+
+#include_next <linux/timer.h>
+
+#ifndef setup_deferrable_timer
+/*
+ * The TIMER_DEFERRABLE flag has not been around since 3.0 so
+ * two different backports are needed here.
+ */
+#ifdef TIMER_DEFERRABLE
+#define setup_deferrable_timer(timer, fn, data) \
+ __setup_timer((timer), (fn), (data), TIMER_DEFERRABLE)
+#else
+static inline void setup_deferrable_timer_key(struct timer_list *timer,
+ const char *name,
+ struct lock_class_key *key,
+ void (*func)(unsigned long),
+ unsigned long data)
+{
+ timer->function = func;
+ timer->data = data;
+ init_timer_deferrable_key(timer, name, key);
+}
+#define setup_deferrable_timer(timer, fn, data) \
+ do { \
+ static struct lock_class_key __key; \
+ setup_deferrable_timer_key((timer), #timer, &__key, \
+ (fn), (data)); \
+ } while (0)
+#endif
+#endif
+
+#ifndef TIMER_DEFERRABLE
+#define TIMER_DEFERRABLE 1
+#endif
+
+#ifndef from_timer
+#define TIMER_DATA_TYPE unsigned long
+#define TIMER_FUNC_TYPE void (*)(TIMER_DATA_TYPE)
+
+static inline void timer_setup(struct timer_list *timer,
+ void (*callback) (struct timer_list *),
+ unsigned int flags)
+{
+#ifdef __setup_timer
+ __setup_timer(timer, (TIMER_FUNC_TYPE) callback,
+ (TIMER_DATA_TYPE) timer, flags);
+#else
+ if (flags & TIMER_DEFERRABLE)
+ setup_deferrable_timer(timer, (TIMER_FUNC_TYPE) callback,
+ (TIMER_DATA_TYPE) timer);
+ else
+ setup_timer(timer, (TIMER_FUNC_TYPE) callback,
+ (TIMER_DATA_TYPE) timer);
+#endif
+}
+
+#define from_timer(var, callback_timer, timer_fieldname) \
+ container_of(callback_timer, typeof(*var), timer_fieldname)
+#endif
+
+#if LINUX_VERSION_IS_LESS(4,15,0)
+#undef DEFINE_TIMER
+#define DEFINE_TIMER(_name, _function) \
+ struct timer_list _name = \
+ __TIMER_INITIALIZER(_function, 0, 0, 0)
+#endif
+
+#endif /* _BACKPORT_TIMER_H */