我们的系统(linux)有一个spin_lock锁定/死锁问题,但我没有一个好主意来解决它。 自旋锁可以进入irq和数据传输功能。锁定发生在:
应用程序将传输数据,然后通过spin_lock_irqsave
获取自旋锁,但尚未调用spin_lock_irqrestore
。这将在CPU1 / CPU2 / CPU3中运行。
irq发生在CPU0中,并尝试通过调用spin_lock_irq_save
获取相同的自旋锁,这会导致系统锁定。因为spin_lock_irqsave
禁用CPU0 irq是一种解决方案,但数据量很大,在传输所有数据之前需要很长时间。一旦我们使用irq亲和力,我们必须禁用所有CPU中的所有irq,这是不可接受的。
还有其他方法可以解决这个问题吗?有经验吗?我想内核应该已经有了解决这个问题的机制,但我不知道。
提前致谢!
答案 0 :(得分:0)
你说传输可能需要很长时间,但在这种情况下应避免使用自旋锁。自旋锁应主要用于低级并发,并尽可能少用。
您可以使用互斥锁或信号量。例如,互斥锁
/**
* mutex_is_locked - is the mutex locked
* @lock: the mutex to be queried
*
* Returns 1 if the mutex is locked, 0 if unlocked.
*/
static inline int mutex_is_locked(struct mutex *lock)
{
return atomic_read(&lock->count) != 1;
}
您可以使用它来检查互斥锁是否已被占用。有了这个,你可以避免死锁。