提交 188665b2 编写于 作者: K Kees Cook

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: NKees Cook <keescook@chromium.org>
上级 1fe66ba5
...@@ -78,53 +78,56 @@ struct timer_list { ...@@ -78,53 +78,56 @@ struct timer_list {
struct timer_list _name = \ struct timer_list _name = \
__TIMER_INITIALIZER((TIMER_FUNC_TYPE)_function, 0) __TIMER_INITIALIZER((TIMER_FUNC_TYPE)_function, 0)
void init_timer_key(struct timer_list *timer, unsigned int flags, void init_timer_key(struct timer_list *timer,
void (*func)(struct timer_list *), unsigned int flags,
const char *name, struct lock_class_key *key); const char *name, struct lock_class_key *key);
#ifdef CONFIG_DEBUG_OBJECTS_TIMERS #ifdef CONFIG_DEBUG_OBJECTS_TIMERS
extern void init_timer_on_stack_key(struct timer_list *timer, extern void init_timer_on_stack_key(struct timer_list *timer,
void (*func)(struct timer_list *),
unsigned int flags, const char *name, unsigned int flags, const char *name,
struct lock_class_key *key); struct lock_class_key *key);
extern void destroy_timer_on_stack(struct timer_list *timer); extern void destroy_timer_on_stack(struct timer_list *timer);
#else #else
static inline void destroy_timer_on_stack(struct timer_list *timer) { } static inline void destroy_timer_on_stack(struct timer_list *timer) { }
static inline void init_timer_on_stack_key(struct timer_list *timer, static inline void init_timer_on_stack_key(struct timer_list *timer,
unsigned int flags, const char *name, void (*func)(struct timer_list *),
unsigned int flags,
const char *name,
struct lock_class_key *key) struct lock_class_key *key)
{ {
init_timer_key(timer, flags, name, key); init_timer_key(timer, func, flags, name, key);
} }
#endif #endif
#ifdef CONFIG_LOCKDEP #ifdef CONFIG_LOCKDEP
#define __init_timer(_timer, _flags) \ #define __init_timer(_timer, _fn, _flags) \
do { \ do { \
static struct lock_class_key __key; \ static struct lock_class_key __key; \
init_timer_key((_timer), (_flags), #_timer, &__key); \ init_timer_key((_timer), (_fn), (_flags), #_timer, &__key);\
} while (0) } while (0)
#define __init_timer_on_stack(_timer, _flags) \ #define __init_timer_on_stack(_timer, _fn, _flags) \
do { \ do { \
static struct lock_class_key __key; \ static struct lock_class_key __key; \
init_timer_on_stack_key((_timer), (_flags), #_timer, &__key); \ init_timer_on_stack_key((_timer), (_fn), (_flags), \
#_timer, &__key); \
} while (0) } while (0)
#else #else
#define __init_timer(_timer, _flags) \ #define __init_timer(_timer, _fn, _flags) \
init_timer_key((_timer), (_flags), NULL, NULL) init_timer_key((_timer), (_fn), (_flags), NULL, NULL)
#define __init_timer_on_stack(_timer, _flags) \ #define __init_timer_on_stack(_timer, _fn, _flags) \
init_timer_on_stack_key((_timer), (_flags), NULL, NULL) init_timer_on_stack_key((_timer), (_fn), (_flags), NULL, NULL)
#endif #endif
#define __setup_timer(_timer, _fn, _flags) \ #define __setup_timer(_timer, _fn, _flags) \
do { \ do { \
__init_timer((_timer), (_flags)); \ __init_timer((_timer), (_fn), (_flags)); \
(_timer)->function = (_fn); \
} while (0) } while (0)
#define __setup_timer_on_stack(_timer, _fn, _flags) \ #define __setup_timer_on_stack(_timer, _fn, _flags) \
do { \ do { \
__init_timer_on_stack((_timer), (_flags)); \ __init_timer_on_stack((_timer), (_fn), (_flags)); \
(_timer)->function = (_fn); \
} while (0) } while (0)
#ifndef CONFIG_LOCKDEP #ifndef CONFIG_LOCKDEP
......
...@@ -707,14 +707,18 @@ static inline void debug_timer_assert_init(struct timer_list *timer) ...@@ -707,14 +707,18 @@ static inline void debug_timer_assert_init(struct timer_list *timer)
debug_object_assert_init(timer, &timer_debug_descr); debug_object_assert_init(timer, &timer_debug_descr);
} }
static void do_init_timer(struct timer_list *timer, unsigned int flags, static void do_init_timer(struct timer_list *timer,
void (*func)(struct timer_list *),
unsigned int flags,
const char *name, struct lock_class_key *key); const char *name, struct lock_class_key *key);
void init_timer_on_stack_key(struct timer_list *timer, unsigned int flags, 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) const char *name, struct lock_class_key *key)
{ {
debug_object_init_on_stack(timer, &timer_debug_descr); debug_object_init_on_stack(timer, &timer_debug_descr);
do_init_timer(timer, flags, name, key); do_init_timer(timer, func, flags, name, key);
} }
EXPORT_SYMBOL_GPL(init_timer_on_stack_key); EXPORT_SYMBOL_GPL(init_timer_on_stack_key);
...@@ -755,10 +759,13 @@ static inline void debug_assert_init(struct timer_list *timer) ...@@ -755,10 +759,13 @@ static inline void debug_assert_init(struct timer_list *timer)
debug_timer_assert_init(timer); debug_timer_assert_init(timer);
} }
static void do_init_timer(struct timer_list *timer, unsigned int flags, static void do_init_timer(struct timer_list *timer,
void (*func)(struct timer_list *),
unsigned int flags,
const char *name, struct lock_class_key *key) const char *name, struct lock_class_key *key)
{ {
timer->entry.pprev = NULL; timer->entry.pprev = NULL;
timer->function = func;
timer->flags = flags | raw_smp_processor_id(); timer->flags = flags | raw_smp_processor_id();
lockdep_init_map(&timer->lockdep_map, name, key, 0); lockdep_init_map(&timer->lockdep_map, name, key, 0);
} }
...@@ -766,6 +773,7 @@ static void do_init_timer(struct timer_list *timer, unsigned int flags, ...@@ -766,6 +773,7 @@ static void do_init_timer(struct timer_list *timer, unsigned int flags,
/** /**
* init_timer_key - initialize a timer * init_timer_key - initialize a timer
* @timer: the timer to be initialized * @timer: the timer to be initialized
* @func: timer callback function
* @flags: timer flags * @flags: timer flags
* @name: name of the timer * @name: name of the timer
* @key: lockdep class key of the fake lock used for tracking timer * @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,11 +782,12 @@ static void do_init_timer(struct timer_list *timer, unsigned int flags,
* init_timer_key() must be done to a timer prior calling *any* of the * init_timer_key() must be done to a timer prior calling *any* of the
* other timer functions. * other timer functions.
*/ */
void init_timer_key(struct timer_list *timer, unsigned int flags, void init_timer_key(struct timer_list *timer,
void (*func)(struct timer_list *), unsigned int flags,
const char *name, struct lock_class_key *key) const char *name, struct lock_class_key *key)
{ {
debug_init(timer); debug_init(timer);
do_init_timer(timer, flags, name, key); do_init_timer(timer, func, flags, name, key);
} }
EXPORT_SYMBOL(init_timer_key); EXPORT_SYMBOL(init_timer_key);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册