extern void nohz_balance_enter_idle(int cpu); extern void set_cpu_sd_state_idle(void); extern int get_nohz_timer_target(void); @@ -1758,13 +1758,13 @@ static inline int set_cpus_allowed_ptr(struct task_struct *p, } #endif -#ifdef CONFIG_NO_HZ +#ifdef CONFIG_NO_HZ_COMMON void ...
另外对于 nohz,还有一个重要的东西,就是 idle load balance,简称 ilb,这个过程就是在多个 cpu 中, 不能全部都进入 nohz,因为这样的话,可能时间长了,各个 cpu 负载会极端的不均衡,因此必须有一个 cpu 看家,这样别的 cpu 才能安心睡眠,否则所有的 cpu 都只能等待下次的唤醒事件了,其实别的 cpu 都进入 nohz ...
int cpu = smp_processor_id(); if (idle_cpu(cpu) && !in_interrupt()) tick_nohz_stop_idle(cpu); #endif __irq_enter(); #ifdef CONFIG_NO_HZ if (idle_cpu(cpu)) tick_nohz_update_jiffies(); //更新计时,nohz模式由此来作为触发下一中断的时机参考。怎么理解呢?看看这个调用条件,只有在cpu处...
下面的代码体现了这一点,在每次进入硬件中断处理的时候都要调用irq_enter: 复制 void irq_enter(void){#ifdef CONFIG_NO_HZintcpu=smp_processor_id();if (idle_cpu(cpu) && !in_interrupt())tick_nohz_stop_idle(cpu);#endif__irq_enter();#ifdef CONFIG_NO_HZif (idle_cpu(cpu))tick_nohz_update_...
下面的代码体现了这一点,在每次进入硬件中断处理的时候都要调用irq_enter: void irq_enter(void) { #ifdef CONFIG_NO_HZ int cpu = smp_processor_id(); if (idle_cpu(cpu) && !in_interrupt()) tick_nohz_stop_idle(cpu); #endif __irq_enter();...