在一个处理器上,在同一个线程中,首先调用 raw_spin_lock(),然后它启动一个 hrtimer 并再次返回 raw_spin_lock(),它将在那里旋转。在 hrtimer 中断处理函数中,会调用 raw_spin_unlock()。
这会导致死锁吗?在 raw_spin_lock() 上旋转会禁用中断吗?
在一个处理器上,在同一个线程中,首先调用 raw_spin_lock(),然后它启动一个 hrtimer 并再次返回 raw_spin_lock(),它将在那里旋转。在 hrtimer 中断处理函数中,会调用 raw_spin_unlock()。
这会导致死锁吗?在 raw_spin_lock() 上旋转会禁用中断吗?
raw_spin_lock_irq()
并raw_spin_lock_irqsave()
禁用本地中断,但其他 CPU 上的中断仍然可能发生。raw_spin_lock()
才不是。
如果任何中断处理程序试图锁定已经持有的自旋锁,那么在不小心启用本地中断的情况下使用自旋锁可能会导致死锁。出于同样的原因,我提到的所有功能都不是可重入的。锁拥有者永远不可能释放锁。不过,既然在这种情况下 ISR 会释放锁,死锁应该不成问题。
我认为您还应该检查完成变量,这些变量旨在执行您似乎试图以这种不寻常的方式使用自旋锁来完成的事情。见这个和wait_on_completion(_interruptible)(_timeout)()
这里的功能。
更多关于自旋锁的信息可以在这里找到。