Linux kernel SMP系统中是否只应在一个内核上调用_timer()?

Linux kernel SMP系统中是否只应在一个内核上调用_timer()?,linux-kernel,Linux Kernel,我知道do_timer负责更新jiffies计数器。因此,我的问题是,它可以在不同的内核上执行,还是始终在发生计时器滴答声的同一个内核上执行?在谷歌搜索和阅读代码后,让我回答我自己的问题 应该在cpu上调用,ID保持在变量中 kernel/time/tick common.c /* *tick_do_timer_cpu是一个计时器核心内部变量,它保存cpu NR *它负责调用do_timer(),即计时功能。这 *变量有两个函数: * *1)防止数以百万计的CPU试图抢占市场份额时出现雷鸣般的群

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

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

应该在cpu上调用,ID保持在变量中

kernel/time/tick common.c

/*
*tick_do_timer_cpu是一个计时器核心内部变量,它保存cpu NR
*它负责调用do_timer(),即计时功能。这
*变量有两个函数:
*
*1)防止数以百万计的CPU试图抢占市场份额时出现雷鸣般的群体问题
*计时锁一次锁上。仅分配给执行此操作的CPU
*更新正在处理它。
*
*2)通过将值设置为
*勾选“定时器无”,即不存在CPU。所以下一个cpu看起来是
*至少,它将接管并保持时间的活力。移交
*该过程还包括cpu热插拔。
*/

tick\u do\u timer\u cpu
是根据当前cpu ID检查的。如果当前CPU相同,则调用
do\u 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);
  }`

通过这种方式,在SMP系统中的一个内核上执行jiffies管理。

根据
do\u timer
实现,它更新
jiffies\u 64
,这是全局变量(不是每个CPU)。因此,它对单核CPU系统没有任何限制。事实上,它是全局的,不是每个CPU变量,但如果从更广泛的上下文来看,do_timer()总是在一个CPU上调用。在哪一个上,它存储在tick\u do\u timer\u cpu变量中。