在spin_lock_irqsave中调用printk是否安全?

时间:2014-12-18 05:19:26

标签: linux kernel sleep irq printk

我写过这样的代码:

处于非中断状态:

spin_lock_irqsave(&lock, flags);
printk("some message blah...\n");
spin_unlock_irqrestore(&lock, flags);

我正在运行此代码"看起来"安全,因为我没有看到任何崩溃。 但是,我不确定这是否真的是一个安全的代码。因为这可能会以1/100000的概率触发系统崩溃。

此外,我想知道是否打电话"睡眠" spin_lock_irqsave中的函数是安全的(在非中断上下文中)。

1 个答案:

答案 0 :(得分:2)

内核代码在按住自旋锁时不应该睡眠。在Linux Device Drivers, Third Edition中,"自旋锁和原子上下文"第5章中的部分说明:

Therefore, the core rule that applies to spinlocks is that any code must,
while holding a spinlock, be atomic. It cannot sleep; in fact, it cannot
relinquish the processor for any reason except to service interrupts (and
sometimes not even then).

对于printk,我认为在关键部分内打电话是安全的。 source code中的评论甚至提到:

This is printk(). It can be called from any context. We want it to work.