阅读213 返回首页    go 阿里云 go 技术社区[云栖]


时间子系统3_低分辨率定时框架初始化

//	低分辨率定时器框架初始化
//	调用路径: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;
} ;

                                                                 

//	参考 深入理解linux内核架构


最后更新:2017-04-03 14:54:25

  上一篇:go UVA之1388 - Graveyard
  下一篇:go 时间子系统9_timekeeper初始化