c - 为什么Linux内核中没有wait_event_..._irqsave()函数或宏?

标签 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() 解锁/锁定它。 是否有特定原因导致未提供使用 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/

相关文章:

c - pcap unix 缓冲如何工作?

从用户区复制变量

linux - 同步两个本地目录

Linux 函数名冲突 MATLAB

php - 获取当前 php 文件的目录,该文件自脚本开始运行以来可能已更改

windows - 两个 CPU 内核上的 InterlockedExchange

windows - 内核跟踪 Windows 7 WinDbg

c - read() 没有读取完整的 http 响应

c - 当左移不等于乘以 2

c - 如何测试指针数组的末尾?