]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
timer: Pass timer_list pointer to callbacks unconditionally
authorKees Cook <keescook@chromium.org>
Mon, 23 Oct 2017 01:18:19 +0000 (18:18 -0700)
committerKees Cook <keescook@chromium.org>
Tue, 21 Nov 2017 23:57:12 +0000 (15:57 -0800)
Now that all timer callbacks are already taking their struct timer_list
pointer as the callback argument, just do this unconditionally and remove
the .data field.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
include/linux/timer.h
kernel/time/timer.c

index 47615dca4c5ca86fc7293ab929174d1013f60103..20a6e7af5fd62b8796df9d8125445b19f1fc3417 100644 (file)
@@ -18,7 +18,6 @@ struct timer_list {
        struct hlist_node       entry;
        unsigned long           expires;
        void                    (*function)(unsigned long);
-       unsigned long           data;
        u32                     flags;
 
 #ifdef CONFIG_LOCKDEP
@@ -70,7 +69,6 @@ struct timer_list {
 #define __TIMER_INITIALIZER(_function, _data, _flags) {                \
                .entry = { .next = TIMER_ENTRY_STATIC },        \
                .function = (_function),                        \
-               .data = (_data),                                \
                .flags = (_flags),                              \
                __TIMER_LOCKDEP_MAP_INITIALIZER(                \
                        __FILE__ ":" __stringify(__LINE__))     \
@@ -121,14 +119,12 @@ static inline void init_timer_on_stack_key(struct timer_list *timer,
        do {                                                            \
                __init_timer((_timer), (_flags));                       \
                (_timer)->function = (_fn);                             \
-               (_timer)->data = (_data);                               \
        } while (0)
 
 #define __setup_timer_on_stack(_timer, _fn, _data, _flags)             \
        do {                                                            \
                __init_timer_on_stack((_timer), (_flags));              \
                (_timer)->function = (_fn);                             \
-               (_timer)->data = (_data);                               \
        } while (0)
 
 #ifndef CONFIG_LOCKDEP
index af0b8bae45027042ff153172522b659fb605cf1d..a07eb124332f0a9e0ee49a4ee411a0a896a8e7ce 100644 (file)
@@ -1107,12 +1107,12 @@ EXPORT_SYMBOL(timer_reduce);
  * add_timer - start a timer
  * @timer: the timer to be added
  *
- * The kernel will do a ->function(->data) callback from the
+ * The kernel will do a ->function(@timer) callback from the
  * timer interrupt at the ->expires point in the future. The
  * current time is 'jiffies'.
  *
- * The timer's ->expires, ->function (and if the handler uses it, ->data)
- * fields must be set prior calling this function.
+ * The timer's ->expires, ->function fields must be set prior calling this
+ * function.
  *
  * Timers with an ->expires field in the past will be executed in the next
  * timer tick.
@@ -1284,8 +1284,7 @@ int del_timer_sync(struct timer_list *timer)
 EXPORT_SYMBOL(del_timer_sync);
 #endif
 
-static void call_timer_fn(struct timer_list *timer, void (*fn)(unsigned long),
-                         unsigned long data)
+static void call_timer_fn(struct timer_list *timer, void (*fn)(unsigned long))
 {
        int count = preempt_count();
 
@@ -1309,7 +1308,7 @@ static void call_timer_fn(struct timer_list *timer, void (*fn)(unsigned long),
        lock_map_acquire(&lockdep_map);
 
        trace_timer_expire_entry(timer);
-       fn(data);
+       fn((TIMER_DATA_TYPE)timer);
        trace_timer_expire_exit(timer);
 
        lock_map_release(&lockdep_map);
@@ -1332,7 +1331,6 @@ static void expire_timers(struct timer_base *base, struct hlist_head *head)
        while (!hlist_empty(head)) {
                struct timer_list *timer;
                void (*fn)(unsigned long);
-               unsigned long data;
 
                timer = hlist_entry(head->first, struct timer_list, entry);
 
@@ -1340,15 +1338,14 @@ static void expire_timers(struct timer_base *base, struct hlist_head *head)
                detach_timer(timer, true);
 
                fn = timer->function;
-               data = timer->data;
 
                if (timer->flags & TIMER_IRQSAFE) {
                        raw_spin_unlock(&base->lock);
-                       call_timer_fn(timer, fn, data);
+                       call_timer_fn(timer, fn);
                        raw_spin_lock(&base->lock);
                } else {
                        raw_spin_unlock_irq(&base->lock);
-                       call_timer_fn(timer, fn, data);
+                       call_timer_fn(timer, fn);
                        raw_spin_lock_irq(&base->lock);
                }
        }