私たちのシステム (Linux) には、spin_lock ロックアップ/デッドロックの問題がありますが、それを解決する良いアイデアがありません。スピンロックは、irq とデータ送信関数で取得できます。ロックアップは次の場合に発生しました。
アプリはデータを送信しようとしており、 を介してスピンロックを取得しました
spin_lock_irqsave
が、 を呼び出していませんspin_lock_irqrestore
。これは CPU1/CPU2/CPU3 で実行されます。CPU0 で irq が発生し、 を呼び出して同じスピンロックを取得しようとすると
spin_lock_irq_save
、システムのロックアップが発生します。のプリエンプションが無効になっているためspin_lock_irqsave
です。
CPU0 irq を無効にすることが解決策ですが、データが巨大で、すべてのデータを送信するまでに長い時間がかかります。また、irq アフィニティを使用すると、すべての CPU ですべての irq を無効にする必要がありますが、これは受け入れられません。
この問題を解決する他の方法はありますか? 経験はありますか?カーネルにはこれを解決するメカニズムがすでにあるはずだと思いますが、わかりません。
前もって感謝します!