- timer_setup(timer, callback, flags) 用于为第一次使用timer做好准备,一般和add_timer 配合使用
- 其使用的例程如下:
- static void prb_setup_retire_blk_timer(struct packet_sock *po)
- {
- struct tpacket_kbdq_core *pkc;
-
- pkc = GET_PBDQC_FROM_RB(&po->rx_ring);
- timer_setup(&pkc->retire_blk_timer, prb_retire_rx_blk_timer_expired,
- 0);
- pkc->retire_blk_timer.expires = jiffies;
- }
- 其源码分析如下:
- #define timer_setup(timer, callback, flags) \
- __init_timer((timer), (callback), (flags))
- 原来这个是一个宏
- #ifdef CONFIG_LOCKDEP
- #define __init_timer(_timer, _fn, _flags) \
- do { \
- static struct lock_class_key __key; \
- init_timer_key((_timer), (_fn), (_flags), #_timer, &__key);\
- } while (0)
-
- #define __init_timer_on_stack(_timer, _fn, _flags) \
- do { \
- static struct lock_class_key __key; \
- init_timer_on_stack_key((_timer), (_fn), (_flags), \
- #_timer, &__key); \
- } while (0)
- #else
- #define __init_timer(_timer, _fn, _flags) \
- init_timer_key((_timer), (_fn), (_flags), NULL, NULL)
- #define __init_timer_on_stack(_timer, _fn, _flags) \
- init_timer_on_stack_key((_timer), (_fn), (_flags), NULL, NULL)
- #endif
- config_lockedp用于检测死锁,常用debug,这里假定没有开这个宏
- 所以这里的又会转调init_timer_key
- void init_timer_key(struct timer_list *timer,
- void (*func)(struct timer_list *), unsigned int flags,
- const char *name, struct lock_class_key *key)
- {
- #如果没有打开CONFIG_DEBUG_OBJECTS_TIMERS的话,debug_init 为null
- debug_init(timer);
- #所以主要调用这个函数初始化timer
- do_init_timer(timer, func, flags, name, key);
- }
-
- 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)
- {
- #pprev 为null,说明这个timer处于pending状态,当然了刚开始创建timer的时候当然要pending了,毕竟
- #还没有开始执行
- timer->entry.pprev = NULL;
- #时间到期要执行的回调函数
- timer->function = func;
- #看来flags中保存了当前的cpu id
- timer->flags = flags | raw_smp_processor_id();
- lockdep_init_map(&timer->lockdep_map, name, key, 0);
- }
- 总结一下,看起来timer_setup(timer, callback, flags) 主要用是用callback和flags来给timer_list *timer 来赋值
- 但是不包括新建这个指针.
|