这么多个timeout , 头都晕了!.......最后知道为什么看不懂了,有部份代码没权限看......
if ( timer == 警告的门限) {
这边有个关键的地方 : 辅助cpu设置了重启时间为 15s, 同时向主cpu 发警告中断。
在警告中断里面 通知应用层的 watch dog守护进程,让它查下应用层重要进程是否活着。
if (一切ok,那么重新设置器的超时时间, 也就是 60 = 75 -15, timer = timeout - pre_timeout;)
else (上层被监控的进程有问题,或者watch dog自身有问题, 而导致不能重置timer, 也就是不能把 15s改为60 s, 则重启设备)
}
哇塞,终于懂了。
==================================
如果 cpu 进入睡眠,则timer也停止。
如果上层watchdong 守护进程没有起来,则到超时时间75秒后,由于没人去喂狗,则重启设备。
=======================================
wd_timeout = timeout + pre_timeout + WATCHDOG_EXTRA_MARGIN;
timeout == wd_timeout; 所以这个75s 就是wdt 要重新启动设备的门限。
Reset Warning Threshold = 总的超时时间 - pre_timeout;
timer_timeout: 调度后台进程的时间。
timer_timeout: 两次 timer 中断间隔的时间
=====================================
[转]
hard lockup的发生是由于禁止了CPU的所有中断超过一定时间(几秒)这种情况下,外部设备发生的中断无法处理,内核认为此时发生了所谓的hard lockup. 由于NMI( Non Mask Interrup)中断是不可屏蔽的中断,因此可以用来检测是否发生了hard lockup, NMI中断是周期性发生的,在相应的中断处理函数中检测一个全局变量的值(这个全局变量的值是由CPU本地定时器的中断处理程序改动的),判断该变量是否和上次保存的值相等,若相等,则认为系统发生了某种异常(中断禁止的时间超过了上限),然后调用panic函数重启系统,显示hard lockup. 出现这种情况的可能原因是由于spin_lock_irqsave(内部实现有一个反复delay的操作https://lkml.org/lkml/2012/9/13/656)导致的,如果一个线程反复获取同一个spinlock, 跑在另一个CPU的线程尝试获取该spinlock时,会禁止中断然后一直等待,如果超过一定的时间,就会导致NMI中断处理程序调用panic重启系统。