内核定时机制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);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值