在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}}方面的内容?
答案 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()
之前已启用了中断,并且可以安全地重新启用中断。