spin_lock 与 spin_lock_irq 与 spin_lock_irqsave

spin_lock 与 spin_lock_irq 与 spin_lock_irqsave

我目前正在忙的内核中有三个 spin_lock 函数。

  • 自旋锁
  • 自旋锁中断
  • 自旋锁中断保存

我只找到只涉及其中两个的贡献(包括 Linux 文档)。
然后,答案或解释就会变得模棱两可或相互矛盾,甚至包含评论说该解释是错误的。这使得很难获得概览。
一些基础知识对我来说很清楚,例如在中断上下文中,简单的 spin_lock() 可能会导致死锁。但我真的很感激关于这个主题的完整描述。

我需要理解:

  • 什么时候应该使用哪个版本,什么时候不应该使用?
  • 什么时候不需要使用更安全的版本但不会造成伤害(性能除外)?
  • 在特定情况下使用某个版本的原因是什么?

答案1

第 5 章中给出了简要描述。并发性和竞争条件Linux 设备驱动程序,第三版

void spin_lock(spinlock_t *lock);
void spin_lock_irqsave(spinlock_t *lock, unsigned long flags);
void spin_lock_irq(spinlock_t *lock);

spin_lock_irqsave在获取自旋锁之前禁用中断(仅在本地处理器上);先前的中断状态存储在 中flags。如果您绝对确定没有其他任何东西可能已经禁用了处理器上的中断(或者,换句话说,您确定在释放自旋锁时应该启用中断),spin_lock_irq则可以使用而不需要跟踪标志。

spin_lock_irq*如果您希望自旋锁可以保存在中断上下文中,那么这些函数就很重要。原因是,如果自旋锁由本地 CPU 持有,然后本地 CPU 提供中断服务,该中断也尝试锁定自旋锁,那么就会出现死锁。

相关内容