为什么Linux内核中没有wait_event _..._ irqsave()函数或宏?

时间:2019-06-24 13:31:53

标签: c linux kernel spinlock irq

在Linux内核中,wait_event_lock_irq(wq_head, condition, lock)中提供了函数include/linux/wait.h,该函数希望保留lock并使用spin_lock_irq()spin_unlock_irq()对其进行解锁/锁定。 是否有特定原因导致未提供使用wait_event_lock_irqsave() / spin_lock_irqsave()的{​​{1}}方面的内容?

1 个答案:

答案 0 :(得分:0)

spin_lock_irqsave()spin_unlock_irqrestore()保存并恢复CPU的“已启用中断”状态标志。如果您知道自己不是在启用了中断的中断上下文中运行,而是需要与在中断上下文中获取的锁同步,则可以使用spin_lock_irq()spin_unlock_irq()来禁用和重新启用中断而无需保留“允许中断”状态标志。

绝对不要从中断上下文中调用wait_event_...()宏(因为它们可能会休眠),因此可以安全地假设它们不是从中断上下文中调用的,因此,无需保留CPU的“已启用中断”状态标志。正常(非IRQ)wait_event_...()宏也应从不在禁用中断的情况下调用(再次,因为它们可能会休眠),因此可以安全地假定未禁用中断。当然,在禁用中断的情况下调用了wait_event_..._lock_irq() ,但是它们假定在先前调用spin_lock_irq()之前已启用了中断,并且可以安全地重新启用中断。