我们的系统(linux)有一个 spin_lock 锁定/死锁问题,但我没有一个好主意来解决它。自旋锁可以在 irq 和数据传输功能中获得。锁定发生在:
该应用程序将传输数据,然后它通过 获取自旋锁
spin_lock_irqsave
,但没有调用spin_lock_irqrestore
. 这将在 CPU1/CPU2/CPU3 中运行。中断发生在CPU0,并试图通过调用获取相同的自旋锁
spin_lock_irq_save
,这导致系统锁定。因为对spin_lock_irqsave
.
禁用 CPU0 irq 是一种解决方案,但是数据量很大,传输所有数据需要很长时间。而且一旦我们使用了 irq 亲和性,我们就必须禁用所有 CPU 中的所有 irq,这是不可接受的。
有没有其他方法可以解决这个问题?有什么经验吗?我猜内核应该已经有了解决这个问题的机制,但我不知道。
提前致谢!