0

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

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

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

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

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

提前致谢!

4

1 回答 1

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

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

于 2014-01-27T10:38:21.000 回答