watch dog

这么多个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重启系统。

你可能感兴趣的:(watch dog)