閱讀213 返回首頁    go 小米 go 小米5


時間子係統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初始化