低分辨率定时器框架(1 )

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值