我写过这样的代码:
处于非中断状态:
spin_lock_irqsave(&lock, flags);
printk("some message blah...\n");
spin_unlock_irqrestore(&lock, flags);
我正在运行此代码"看起来"安全,因为我没有看到任何崩溃。 但是,我不确定这是否真的是一个安全的代码。因为这可能会以1/100000的概率触发系统崩溃。
此外,我想知道是否打电话"睡眠" spin_lock_irqsave中的函数是安全的(在非中断上下文中)。
答案 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.