0

私たちのシステム (Linux) には、spin_lock ロックアップ/デッドロックの問題がありますが、それを解決する良いアイデアがありません。スピンロックは、irq とデータ送信関数で取得できます。ロックアップは次の場合に発生しました。

  1. アプリはデータを送信しようとしており、 を介してスピンロックを取得しましたspin_lock_irqsaveが、 を呼び出していませんspin_lock_irqrestore。これは CPU1/CPU2/CPU3 で実行されます。

  2. CPU0 で irq が発生し、 を呼び出して同じスピンロックを取得しようとすると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 に答える