c - 为什么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()
解决方案
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()
推荐阅读
- servicenow - 我应该如何在 servicenow 中显示记录并隐藏安全约束消息
- java - Jhipster 新角色 - 需要完全身份验证
- google-apps-script - 如何将 ActiveSheet 重写为特定的工作表和列?
- binary - 以 1 开头的 8 位数字的紧凑公式
- javascript - 将参数传递给 Vue 路由器元标题
- c - 指针的 scanf 函数不起作用(对于使用指针指针的矩阵)
- go - 将 RFC3339 字符串解析为时间时无法将时间解析为 T
- java - 如果记录没有字段,Mongo-Spark 连接器会在读取时跳过对象
- kotlin - Kotlin 四字节 unicode 文字?
- docker-compose - docker swarm restart 'any' 的意思