// 低分辨率定时器框架初始化
// 调用路径:start_kernel->init_timers
// 函数任务:
// 1.创建当前cpu的定时器框架数据结构
// 2.监听cpu状态信息
// 3.注册低分辨率软中断
1.1 void __init init_timers(void)
{
//创建当前cpu的定时器框架数据结构
int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,
(void *)(long)smp_processor_id());
//监听cpu状态信息
register_cpu_notifier(&timers_nb);
//注册低分辨率软中断
open_softirq(TIMER_SOFTIRQ, run_timer_softirq);
}
// cpu状态监听控制块
2.1 static struct notifier_block __cpuinitdata timers_nb = {
.notifier_call = timer_cpu_notify,
};
// 低分辨率定时器框架处理cpu状态
// 函数任务:
// 1.cpu up,创建本cpu的低分辨率定时器框架
// 2.cpu dead,迁移其定时器到本cpu上
2.2 static int __cpuinit timer_cpu_notify(struct notifier_block *self,
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
//cpu up,创建本cpu的低分辨率定时器框架的数据结构
switch(action) {
case CPU_UP_PREPARE:
case CPU_UP_PREPARE_FROZEN:
if (init_timers_cpu(cpu) < 0)
return NOTIFY_BAD;
break;
//热插拔cpu,才会出现cpu dead、frozen信息
#ifdef CONFIG_HOTPLUG_CPU
case CPU_DEAD:
case CPU_DEAD_FROZEN:
//迁移其cpu的定时器到本cpu
migrate_timers(cpu);
break;
#endif
default:
break;
}
return NOTIFY_OK;
}
// 初始化cpu的定时器框架数据结构
// 调用路径:timer_cpu_notify->init_timers_cpu
// 函数任务:
// 1.分配低分辨率定时器框架数据结构
// 2.初始化tvec_base的链表头
// 3.设置定时器的到期时间戳为当前时间
3.1 static int __cpuinit init_timers_cpu(int cpu)
{
int j;
struct tvec_base *base;
//分配低分辨率定时器框架数据结构
base = kmalloc_node(sizeof(*base),
GFP_KERNEL | __GFP_ZERO,
cpu_to_node(cpu));
base = per_cpu(tvec_bases, cpu);
spin_lock_init(&base->lock);
//初始化tvec_base的链表
for (j = 0; j < TVN_SIZE; j++) {
INIT_LIST_HEAD(base->tv5.vec + j);
INIT_LIST_HEAD(base->tv4.vec + j);
INIT_LIST_HEAD(base->tv3.vec + j);
INIT_LIST_HEAD(base->tv2.vec + j);
}
for (j = 0; j < TVR_SIZE; j++)
INIT_LIST_HEAD(base->tv1.vec + j);
//timer_jiffies记录一个时间点,标识此前到期的定时器都已经执行
base->timer_jiffies = jiffies;
base->next_timer = base->timer_jiffies;
return 0;
}
// 低分辨率定时器框架数据结构
// 注:默认情况下,TVN_SIZE=64,TVR_SIZE=256
3.2 struct tvec {
struct list_head vec[TVN_SIZE];
};
struct tvec_root {
struct list_head vec[TVR_SIZE];
};
struct tvec_base {
spinlock_t lock;
struct timer_list *running_timer; //当前正在运行的timer_list
unsigned long timer_jiffies;
unsigned long next_timer;
struct tvec_root tv1;
struct tvec tv2;
struct tvec tv3;
struct tvec tv4;
struct tvec tv5;
} ;
低分辨率定时器框架(1 )
最新推荐文章于 2023-03-10 15:36:12 发布