如何解决SMP中的自旋锁定问题,irq和函数都需要锁定?

时间:2014-01-27 07:42:42

标签: linux linux-device-driver deadlock spinlock

我们的系统(linux)有一个spin_lock锁定/死锁问题,但我没有一个好主意来解决它。 自旋锁可以进入irq和数据传输功能。锁定发生在:

  1. 应用程序将传输数据,然后通过spin_lock_irqsave获取自旋锁,但尚未调用spin_lock_irqrestore。这将在CPU1 / CPU2 / CPU3中运行。

  2. irq发生在CPU0中,并尝试通过调用spin_lock_irq_save获取相同的自旋锁,这会导致系统锁定。因为spin_lock_irqsave

  3. 禁用了抢占功能

    禁用CPU0 irq是一种解决方案,但数据量很大,在传输所有数据之前需要很长时间。一旦我们使用irq亲和力,我们必须禁用所有CPU中的所有irq,这是不可接受的。

    还有其他方法可以解决这个问题吗?有经验吗?我想内核应该已经有了解决这个问题的机制,但我不知道。

    提前致谢!

1 个答案:

答案 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;
}

您可以使用它来检查互斥锁是否已被占用。有了这个,你可以避免死锁。