- 论坛徽章:
- 2
|
回复 10# Tinnal
static void zap_locks(void)
{
static unsigned long oops_timestamp;
if (time_after_eq(jiffies, oops_timestamp) &&
!time_after(jiffies, oops_timestamp + 30 * HZ))
return;
oops_timestamp = jiffies;
/* If a crash is occurring, make sure we can't deadlock */
spin_lock_init(&logbuf_lock);
/* And make sure that we print immediately */
init_MUTEX(&console_sem)
}
这段逻辑处理用意是:
如果发生了递归,而且是Oops的话,因为Oops打印信息比较重要,优先保证打印Oops信息,所以这里会重新初始化锁,保证后面可以拿到锁,
因为Oops打印的东西比较多,打印又比较慢,所以这里给Oops打印预留了30s时间,如果在30s内再次发生Oops且递归了,那么这里直接返回,不初始化锁;
如果上面理解正确,有2个问题
1,这里比较时间,如果满足了就直接return了,出去后会照样拿锁,绝对死锁;
2,oops_timestamp static类型不初始化时,默认值应该是0吧,第一次Oops进来时,如果jiffies刚好是0~30一个值,也是直接退出,死锁;
|
|