diff options
| author | Kees Cook <keescook@chromium.org> | 2017-10-22 21:14:46 -0400 |
|---|---|---|
| committer | Kees Cook <keescook@chromium.org> | 2017-11-21 18:57:14 -0500 |
| commit | 188665b2d67db8953899551d1a9d4481b2a0ac60 (patch) | |
| tree | a2358bf68d3d4f8c7b775966a4e94cea7b7dc81c | |
| parent | 1fe66ba572b455270dc35a2c099dd7328cec9e4c (diff) | |
timer: Pass function down to initialization routines
In preparation for removing more macros, pass the function down to the
initialization routines instead of doing it in macros.
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>
| -rw-r--r-- | include/linux/timer.h | 33 | ||||
| -rw-r--r-- | kernel/time/timer.c | 21 |
2 files changed, 33 insertions, 21 deletions
diff --git a/include/linux/timer.h b/include/linux/timer.h index e6bab51db13d..aff73b1c8f7b 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h | |||
| @@ -78,53 +78,56 @@ struct timer_list { | |||
| 78 | struct timer_list _name = \ | 78 | struct timer_list _name = \ |
| 79 | __TIMER_INITIALIZER((TIMER_FUNC_TYPE)_function, 0) | 79 | __TIMER_INITIALIZER((TIMER_FUNC_TYPE)_function, 0) |
| 80 | 80 | ||
| 81 | void init_timer_key(struct timer_list *timer, unsigned int flags, | 81 | void init_timer_key(struct timer_list *timer, |
| 82 | void (*func)(struct timer_list *), unsigned int flags, | ||
| 82 | const char *name, struct lock_class_key *key); | 83 | const char *name, struct lock_class_key *key); |
| 83 | 84 | ||
| 84 | #ifdef CONFIG_DEBUG_OBJECTS_TIMERS | 85 | #ifdef CONFIG_DEBUG_OBJECTS_TIMERS |
| 85 | extern void init_timer_on_stack_key(struct timer_list *timer, | 86 | extern void init_timer_on_stack_key(struct timer_list *timer, |
| 87 | void (*func)(struct timer_list *), | ||
| 86 | unsigned int flags, const char *name, | 88 | unsigned int flags, const char *name, |
| 87 | struct lock_class_key *key); | 89 | struct lock_class_key *key); |
| 88 | extern void destroy_timer_on_stack(struct timer_list *timer); | 90 | extern void destroy_timer_on_stack(struct timer_list *timer); |
| 89 | #else | 91 | #else |
| 90 | static inline void destroy_timer_on_stack(struct timer_list *timer) { } | 92 | static inline void destroy_timer_on_stack(struct timer_list *timer) { } |
| 91 | static inline void init_timer_on_stack_key(struct timer_list *timer, | 93 | static inline void init_timer_on_stack_key(struct timer_list *timer, |
| 92 | unsigned int flags, const char *name, | 94 | void (*func)(struct timer_list *), |
| 95 | unsigned int flags, | ||
| 96 | const char *name, | ||
| 93 | struct lock_class_key *key) | 97 | struct lock_class_key *key) |
| 94 | { | 98 | { |
| 95 | init_timer_key(timer, flags, name, key); | 99 | init_timer_key(timer, func, flags, name, key); |
| 96 | } | 100 | } |
| 97 | #endif | 101 | #endif |
| 98 | 102 | ||
| 99 | #ifdef CONFIG_LOCKDEP | 103 | #ifdef CONFIG_LOCKDEP |
| 100 | #define __init_timer(_timer, _flags) \ | 104 | #define __init_timer(_timer, _fn, _flags) \ |
| 101 | do { \ | 105 | do { \ |
| 102 | static struct lock_class_key __key; \ | 106 | static struct lock_class_key __key; \ |
| 103 | init_timer_key((_timer), (_flags), #_timer, &__key); \ | 107 | init_timer_key((_timer), (_fn), (_flags), #_timer, &__key);\ |
| 104 | } while (0) | 108 | } while (0) |
| 105 | 109 | ||
| 106 | #define __init_timer_on_stack(_timer, _flags) \ | 110 | #define __init_timer_on_stack(_timer, _fn, _flags) \ |
| 107 | do { \ | 111 | do { \ |
| 108 | static struct lock_class_key __key; \ | 112 | static struct lock_class_key __key; \ |
| 109 | init_timer_on_stack_key((_timer), (_flags), #_timer, &__key); \ | 113 | init_timer_on_stack_key((_timer), (_fn), (_flags), \ |
| 114 | #_timer, &__key); \ | ||
| 110 | } while (0) | 115 | } while (0) |
| 111 | #else | 116 | #else |
| 112 | #define __init_timer(_timer, _flags) \ | 117 | #define __init_timer(_timer, _fn, _flags) \ |
| 113 | init_timer_key((_timer), (_flags), NULL, NULL) | 118 | init_timer_key((_timer), (_fn), (_flags), NULL, NULL) |
| 114 | #define __init_timer_on_stack(_timer, _flags) \ | 119 | #define __init_timer_on_stack(_timer, _fn, _flags) \ |
| 115 | init_timer_on_stack_key((_timer), (_flags), NULL, NULL) | 120 | init_timer_on_stack_key((_timer), (_fn), (_flags), NULL, NULL) |
| 116 | #endif | 121 | #endif |
| 117 | 122 | ||
| 118 | #define __setup_timer(_timer, _fn, _flags) \ | 123 | #define __setup_timer(_timer, _fn, _flags) \ |
| 119 | do { \ | 124 | do { \ |
| 120 | __init_timer((_timer), (_flags)); \ | 125 | __init_timer((_timer), (_fn), (_flags)); \ |
| 121 | (_timer)->function = (_fn); \ | ||
| 122 | } while (0) | 126 | } while (0) |
| 123 | 127 | ||
| 124 | #define __setup_timer_on_stack(_timer, _fn, _flags) \ | 128 | #define __setup_timer_on_stack(_timer, _fn, _flags) \ |
| 125 | do { \ | 129 | do { \ |
| 126 | __init_timer_on_stack((_timer), (_flags)); \ | 130 | __init_timer_on_stack((_timer), (_fn), (_flags)); \ |
| 127 | (_timer)->function = (_fn); \ | ||
| 128 | } while (0) | 131 | } while (0) |
| 129 | 132 | ||
| 130 | #ifndef CONFIG_LOCKDEP | 133 | #ifndef CONFIG_LOCKDEP |
diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 0f0d49a02d04..ffebcf878fba 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c | |||
| @@ -707,14 +707,18 @@ static inline void debug_timer_assert_init(struct timer_list *timer) | |||
| 707 | debug_object_assert_init(timer, &timer_debug_descr); | 707 | debug_object_assert_init(timer, &timer_debug_descr); |
| 708 | } | 708 | } |
| 709 | 709 | ||
| 710 | static void do_init_timer(struct timer_list *timer, unsigned int flags, | 710 | static void do_init_timer(struct timer_list *timer, |
| 711 | void (*func)(struct timer_list *), | ||
| 712 | unsigned int flags, | ||
| 711 | const char *name, struct lock_class_key *key); | 713 | const char *name, struct lock_class_key *key); |
| 712 | 714 | ||
| 713 | void init_timer_on_stack_key(struct timer_list *timer, unsigned int flags, | 715 | void init_timer_on_stack_key(struct timer_list *timer, |
| 716 | void (*func)(struct timer_list *), | ||
| 717 | unsigned int flags, | ||
| 714 | const char *name, struct lock_class_key *key) | 718 | const char *name, struct lock_class_key *key) |
| 715 | { | 719 | { |
| 716 | debug_object_init_on_stack(timer, &timer_debug_descr); | 720 | debug_object_init_on_stack(timer, &timer_debug_descr); |
| 717 | do_init_timer(timer, flags, name, key); | 721 | do_init_timer(timer, func, flags, name, key); |
| 718 | } | 722 | } |
| 719 | EXPORT_SYMBOL_GPL(init_timer_on_stack_key); | 723 | EXPORT_SYMBOL_GPL(init_timer_on_stack_key); |
| 720 | 724 | ||
| @@ -755,10 +759,13 @@ static inline void debug_assert_init(struct timer_list *timer) | |||
| 755 | debug_timer_assert_init(timer); | 759 | debug_timer_assert_init(timer); |
| 756 | } | 760 | } |
| 757 | 761 | ||
| 758 | static void do_init_timer(struct timer_list *timer, unsigned int flags, | 762 | static void do_init_timer(struct timer_list *timer, |
| 763 | void (*func)(struct timer_list *), | ||
| 764 | unsigned int flags, | ||
| 759 | const char *name, struct lock_class_key *key) | 765 | const char *name, struct lock_class_key *key) |
| 760 | { | 766 | { |
| 761 | timer->entry.pprev = NULL; | 767 | timer->entry.pprev = NULL; |
| 768 | timer->function = func; | ||
| 762 | timer->flags = flags | raw_smp_processor_id(); | 769 | timer->flags = flags | raw_smp_processor_id(); |
| 763 | lockdep_init_map(&timer->lockdep_map, name, key, 0); | 770 | lockdep_init_map(&timer->lockdep_map, name, key, 0); |
| 764 | } | 771 | } |
| @@ -766,6 +773,7 @@ static void do_init_timer(struct timer_list *timer, unsigned int flags, | |||
| 766 | /** | 773 | /** |
| 767 | * init_timer_key - initialize a timer | 774 | * init_timer_key - initialize a timer |
| 768 | * @timer: the timer to be initialized | 775 | * @timer: the timer to be initialized |
| 776 | * @func: timer callback function | ||
| 769 | * @flags: timer flags | 777 | * @flags: timer flags |
| 770 | * @name: name of the timer | 778 | * @name: name of the timer |
| 771 | * @key: lockdep class key of the fake lock used for tracking timer | 779 | * @key: lockdep class key of the fake lock used for tracking timer |
| @@ -774,11 +782,12 @@ static void do_init_timer(struct timer_list *timer, unsigned int flags, | |||
| 774 | * init_timer_key() must be done to a timer prior calling *any* of the | 782 | * init_timer_key() must be done to a timer prior calling *any* of the |
| 775 | * other timer functions. | 783 | * other timer functions. |
| 776 | */ | 784 | */ |
| 777 | void init_timer_key(struct timer_list *timer, unsigned int flags, | 785 | void init_timer_key(struct timer_list *timer, |
| 786 | void (*func)(struct timer_list *), unsigned int flags, | ||
| 778 | const char *name, struct lock_class_key *key) | 787 | const char *name, struct lock_class_key *key) |
| 779 | { | 788 | { |
| 780 | debug_init(timer); | 789 | debug_init(timer); |
| 781 | do_init_timer(timer, flags, name, key); | 790 | do_init_timer(timer, func, flags, name, key); |
| 782 | } | 791 | } |
| 783 | EXPORT_SYMBOL(init_timer_key); | 792 | EXPORT_SYMBOL(init_timer_key); |
| 784 | 793 | ||
