我目前正在忙于内核中的三个 spin_lock 函数。
- 自旋锁
- spin_lock_irq
- spin_lock_irqsave
我只找到了只涵盖其中两个的贡献(包括 Linux 文档)。
然后答案或解释被表述为模棱两可或相互矛盾,甚至包含评论说解释是错误的。这使得很难获得概览。
我很清楚一些基础知识,例如在中断上下文中,简单的 spin_lock() 可能会导致死锁。但我真的很感激关于这个主题的完整图片。
我需要明白:
- 什么时候应该或我们使用哪个版本,什么时候不应该?
- 什么时候不需要使用更安全但不会造成伤害的版本(性能除外)?
- 在特定情况下使用版本的原因是什么?
第 5 章给出了简要说明。Linux 设备驱动程序的并发和竞争条件,第三版
spin_lock_irq*
如果您希望自旋锁可以保持在中断上下文中,则这些函数很重要。原因是如果自旋锁由本地 CPU 持有,然后本地 CPU 服务一个中断,该中断也尝试锁定自旋锁,那么您就有了死锁。