在 Linux 内核中,函数 wait_event_lock_irq(wq_head, condition, lock)
在 include/linux/wait.h
中提供,需要 lock
使用 spin_lock_irq()
和 spin_unlock_irq()
解锁/锁定它。
是否有特定原因导致未提供使用 spin_lock_irqsave()
/spin_lock_irqrestore()
的类似 wait_event_lock_irqsave()
的内容?
最佳答案
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() 之前已启用中断
并且可以安全地重新启用中断。
关于c - 为什么Linux内核中没有wait_event_..._irqsave()函数或宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56737715/