timer: Remove redundant __setup_timer*() macros
authorKees Cook <keescook@chromium.org>
Mon, 23 Oct 2017 01:48:43 +0000 (18:48 -0700)
committerKees Cook <keescook@chromium.org>
Tue, 21 Nov 2017 23:57:15 +0000 (15:57 -0800)
With __init_timer*() now matching __setup_timer*(), remove the redundant
internal interface, clean up the resulting definitions and add more
documentation.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tejun Heo <tj@kernel.org>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Shaohua Li <shli@fb.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
include/linux/kthread.h
include/linux/timer.h
include/linux/workqueue.h

index b855c5b72b26340252412a3d0dd25f8c125696d8..dc850d257ea2472b44191e65b691d95bf7d0a226 100644 (file)
@@ -164,9 +164,9 @@ extern void __kthread_init_worker(struct kthread_worker *worker,
 #define kthread_init_delayed_work(dwork, fn)                           \
        do {                                                            \
                kthread_init_work(&(dwork)->work, (fn));                \
-               __setup_timer(&(dwork)->timer,                          \
-                             (TIMER_FUNC_TYPE)kthread_delayed_work_timer_fn,\
-                             TIMER_IRQSAFE);                           \
+               __init_timer(&(dwork)->timer,                           \
+                            kthread_delayed_work_timer_fn,             \
+                            TIMER_IRQSAFE);                            \
        } while (0)
 
 int kthread_worker_fn(void *worker_ptr);
index aff73b1c8f7be441197d1addc3accb87ff143c97..b1ae64b112c262190a543b410b8209a4ec9e6787 100644 (file)
@@ -78,6 +78,9 @@ struct timer_list {
        struct timer_list _name =                               \
                __TIMER_INITIALIZER((TIMER_FUNC_TYPE)_function, 0)
 
+/*
+ * LOCKDEP and DEBUG timer interfaces.
+ */
 void init_timer_key(struct timer_list *timer,
                    void (*func)(struct timer_list *), unsigned int flags,
                    const char *name, struct lock_class_key *key);
@@ -87,9 +90,7 @@ extern void init_timer_on_stack_key(struct timer_list *timer,
                                    void (*func)(struct timer_list *),
                                    unsigned int flags, const char *name,
                                    struct lock_class_key *key);
-extern void destroy_timer_on_stack(struct timer_list *timer);
 #else
-static inline void destroy_timer_on_stack(struct timer_list *timer) { }
 static inline void init_timer_on_stack_key(struct timer_list *timer,
                                           void (*func)(struct timer_list *),
                                           unsigned int flags,
@@ -120,43 +121,26 @@ static inline void init_timer_on_stack_key(struct timer_list *timer,
        init_timer_on_stack_key((_timer), (_fn), (_flags), NULL, NULL)
 #endif
 
-#define __setup_timer(_timer, _fn, _flags)                             \
-       do {                                                            \
-               __init_timer((_timer), (_fn), (_flags));                \
-       } while (0)
-
-#define __setup_timer_on_stack(_timer, _fn, _flags)                    \
-       do {                                                            \
-               __init_timer_on_stack((_timer), (_fn), (_flags));       \
-       } while (0)
+/**
+ * timer_setup - prepare a timer for first use
+ * @timer: the timer in question
+ * @callback: the function to call when timer expires
+ * @flags: any TIMER_* flags
+ *
+ * Regular timer initialization should use either DEFINE_TIMER() above,
+ * or timer_setup(). For timers on the stack, timer_setup_on_stack() must
+ * be used and must be balanced with a call to destroy_timer_on_stack().
+ */
+#define timer_setup(timer, callback, flags)                    \
+       __init_timer((timer), (callback), (flags))
 
-#ifndef CONFIG_LOCKDEP
-static inline void timer_setup(struct timer_list *timer,
-                              void (*callback)(struct timer_list *),
-                              unsigned int flags)
-{
-       __setup_timer(timer, (TIMER_FUNC_TYPE)callback, flags);
-}
+#define timer_setup_on_stack(timer, callback, flags)           \
+       __init_timer_on_stack((timer), (callback), (flags))
 
-static inline void timer_setup_on_stack(struct timer_list *timer,
-                              void (*callback)(struct timer_list *),
-                              unsigned int flags)
-{
-       __setup_timer_on_stack(timer, (TIMER_FUNC_TYPE)callback, flags);
-}
+#ifdef CONFIG_DEBUG_OBJECTS_TIMERS
+extern void destroy_timer_on_stack(struct timer_list *timer);
 #else
-/*
- * Under LOCKDEP, the timer lock_class_key (set up in __init_timer) needs
- * to be tied to the caller's context, so an inline (above) won't work. We
- * do want to keep the inline for argument type checking, though.
- */
-# define timer_setup(timer, callback, flags)                           \
-               __setup_timer((timer), (TIMER_FUNC_TYPE)(callback),     \
-                             (flags))
-# define timer_setup_on_stack(timer, callback, flags)                  \
-               __setup_timer_on_stack((timer),                         \
-                                      (TIMER_FUNC_TYPE)(callback),     \
-                                      (flags))
+static inline void destroy_timer_on_stack(struct timer_list *timer) { }
 #endif
 
 #define from_timer(var, callback_timer, timer_fieldname) \
index 8d11580237f52fbcbdd5a03e00818ef3e388b62c..bff39faba793bfdc87ff4a0f1a9101af170bf15c 100644 (file)
@@ -241,17 +241,17 @@ static inline unsigned int work_static(struct work_struct *work) { return 0; }
 #define __INIT_DELAYED_WORK(_work, _func, _tflags)                     \
        do {                                                            \
                INIT_WORK(&(_work)->work, (_func));                     \
-               __setup_timer(&(_work)->timer,                          \
-                             (TIMER_FUNC_TYPE)delayed_work_timer_fn,   \
-                             (_tflags) | TIMER_IRQSAFE);               \
+               __init_timer(&(_work)->timer,                           \
+                            delayed_work_timer_fn,                     \
+                            (_tflags) | TIMER_IRQSAFE);                \
        } while (0)
 
 #define __INIT_DELAYED_WORK_ONSTACK(_work, _func, _tflags)             \
        do {                                                            \
                INIT_WORK_ONSTACK(&(_work)->work, (_func));             \
-               __setup_timer_on_stack(&(_work)->timer,                 \
-                                      (TIMER_FUNC_TYPE)delayed_work_timer_fn,\
-                                      (_tflags) | TIMER_IRQSAFE);      \
+               __init_timer_on_stack(&(_work)->timer,                  \
+                                     delayed_work_timer_fn,            \
+                                     (_tflags) | TIMER_IRQSAFE);       \
        } while (0)
 
 #define INIT_DELAYED_WORK(_work, _func)                                        \