是否应该在SMP系统中的一个核心上调用do_timer()?

时间:2015-09-28 08:50:32

标签: linux-kernel

我知道do_timer负责更新jiffies计数器。因此,我的问题是,它可以在不同的核心上执行,还是总是在发生计时器滴答的同一核心上执行?

1 个答案:

答案 0 :(得分:3)

让我在谷歌搜索和阅读代码后回答我自己的问题。

do_timer()应该在cpu上调用,ID保存在tick_do_timer_cpu变量中。

kernel/time/tick-common.c

  

/ *
  * tick_do_timer_cpu是一个定时器核心内部变量,它保存CPU NR   *负责调用do_timer(),即计时的东西。这个   *变量有两个功能:
  *
  * 1)防止大量CPU试图抓住这个问题的雷鸣般的群体问题   *计时锁定一次。只有分配到的CPU才能执行   *更新正在处理它。
  *
  * 2)通过将值设置为
来取消NOHZ空闲情况下的任务   * TICK_DO_TIMER_NONE,即不存在的CPU。所以看下来的下一个cpu   *它会接管并保持活着的时间。移交
  *程序还包括cpu hotplug   * /

根据{{​​3}}或tick_periodic()中的当前CPU ID检查

tick_do_timer_cpu。如果当前CPU相同,则调用do_timer(),否则不会。

static void tick_periodic(int cpu)
 {
      if (tick_do_timer_cpu == cpu) {
              write_seqlock(&jiffies_lock);

              /* Keep track of the next tick event */
              tick_next_period = ktime_add(tick_next_period, tick_period);

              do_timer(1);
              write_sequnlock(&jiffies_lock);
              update_wall_time();
      }

      update_process_times(user_mode(get_irq_regs()));
      profile_tick(CPU_PROFILING);
  }`

这样,jiffies管理就在SMP系统中的一个核心上完成。