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重启系统。

Logo

更多推荐