环境 : 2.6.18内核
发生死锁有2中错误:
1 :
soft lockup - cpu#0 stuck for 10s
打印这句话,是在kernel/softlockup.c文件的softlock_tick函数打印的, 时钟中断调用该函数, 该函数检测watchdog thread是否10s没有运行。 若有死循环,则 watchdog thread 一直schedule不了。。。
top 信息解释:
Cpu(s): 0.2%us, 0.0%sys, %ni, 99.7%id, ....
us 表示用户线程所占用的时间。
sys表示内核线程所占用的时间。
hi 表示hard interrupt
si 表示 soft interrupt
发生这种情况的根本原因是
__smp_call_function 里面 的 spin_lock(&call_lock) 一直拿不到锁
而导致它发生的情况目前遇到2种:
1) 死循环
所以如果在某个地方不停retry的话,就必须睡一段时间。
目前使用的是:
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(WAIT_TIME);
目的是: 使这个进程不要占cpu 10s 以上
2)野指针
这个师兄遇到过。。。
2
NMI watch dog
这个是由于死锁的地方使用了类似 spinlock_irq的东西 ,把中断也关掉了。
解决死锁问题:
可以利用 魔术键。
或者 echo t > /proc/sysrq-trigger 打印进程的信息
或者 直接按键盘 alt + sysrq + t