aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2017-10-22 21:14:46 -0400
committerKees Cook <keescook@chromium.org>2017-11-21 18:57:14 -0500
commit188665b2d67db8953899551d1a9d4481b2a0ac60 (patch)
treea2358bf68d3d4f8c7b775966a4e94cea7b7dc81c
parent1fe66ba572b455270dc35a2c099dd7328cec9e4c (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.h33
-rw-r--r--kernel/time/timer.c21
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
81void init_timer_key(struct timer_list *timer, unsigned int flags, 81void 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
85extern void init_timer_on_stack_key(struct timer_list *timer, 86extern 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);
88extern void destroy_timer_on_stack(struct timer_list *timer); 90extern void destroy_timer_on_stack(struct timer_list *timer);
89#else 91#else
90static inline void destroy_timer_on_stack(struct timer_list *timer) { } 92static inline void destroy_timer_on_stack(struct timer_list *timer) { }
91static inline void init_timer_on_stack_key(struct timer_list *timer, 93static 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
710static void do_init_timer(struct timer_list *timer, unsigned int flags, 710static 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
713void init_timer_on_stack_key(struct timer_list *timer, unsigned int flags, 715void 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}
719EXPORT_SYMBOL_GPL(init_timer_on_stack_key); 723EXPORT_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
758static void do_init_timer(struct timer_list *timer, unsigned int flags, 762static 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 */
777void init_timer_key(struct timer_list *timer, unsigned int flags, 785void 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}
783EXPORT_SYMBOL(init_timer_key); 792EXPORT_SYMBOL(init_timer_key);
784 793