首页 > 解决方案 > 为什么Linux内核中没有wait_event_..._irqsave()函数或宏?

问题描述

在 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()spin_lock_irqrestore()

标签: clinuxkernelspinlockirq

解决方案


spin_lock_irqsave()spin_unlock_irqrestore()保存和恢复 CPU 的“中断启用”状态标志。如果您知道您没有在启用中断的中断上下文中运行,但需要与在中断上下文中获取的锁同步,您可以使用spin_lock_irq()andspin_unlock_irq()禁用和重新启用中断而不保留“启用中断”状态标志。

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


推荐阅读