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 来赋值
但是不包括新建这个指针.
内核定时机制API之timer_setup
最新推荐文章于 2024-08-15 19:51:06 发布