我是靠谱客的博主 火星上刺猬,最近开发中收集的这篇文章主要介绍内核定时机制API之add_timer_on,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

add_timer_on 用于在形参指定的cpu上开始一个定时器.
其源码分析如下:
从这个函数可以知道每个cpu上都有timer的list.如果调用add_timer的时候没有指定cpu
其实就是运行在当前的cpu上。
void add_timer_on(struct timer_list *timer, int cpu)
{
	struct timer_base *new_base, *base;
	unsigned long flags;
	#如果这个timer已经pending或者timer到期后的回调函数为null,则通过BUG_ON 打印当前的callstack
	BUG_ON(timer_pending(timer) || !timer->function);
	#得到在形参指定cpu上的timer_base 指针
	new_base = get_timer_cpu_base(timer->flags, cpu);

	/*
	 * If @timer was on a different CPU, it should be migrated with the
	 * old base locked to prevent other operations proceeding with the
	 * wrong base locked.  See lock_timer_base().
	 */
	#在对timer_base 操作期间需要锁定
	base = lock_timer_base(timer, &flags);
	if (base != new_base) {
		timer->flags |= TIMER_MIGRATING;

		raw_spin_unlock(&base->lock);
		base = new_base;
		raw_spin_lock(&base->lock);
		WRITE_ONCE(timer->flags,
			   (timer->flags & ~TIMER_BASEMASK) | cpu);
	}
	#由于NOHZ的影响如果cpu处于idle,或者刚从idle 出来,base的时间可能不准,因此这里会检查是否需要调整
	forward_timer_base(base);

	debug_activate(timer, timer->expires);
	#在形参指定cpu的timer_base上添加这个time
	internal_add_timer(base, timer);
	#解锁对形参cpu的base->lock的解锁
	raw_spin_unlock_irqrestore(&base->lock, flags);
}

最后

以上就是火星上刺猬为你收集整理的内核定时机制API之add_timer_on的全部内容,希望文章能够帮你解决内核定时机制API之add_timer_on所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部