1 つの CPU のみがこの割り込みラインを処理するように、割り込みハンドラーを登録する方法があるかどうかを尋ねたいと思います。問題は、通常のコンテキストと割り込みコンテキストの両方で呼び出すことができる関数があることです。この関数ではirqs_disabled()
、呼び出し元のコンテキストを確認するために使用します。呼び出し元のコンテキストが割り込みの場合、処理をポーリング モードに切り替えます (割り込みステータス レジスタを継続的にチェックします)。はirqs_disabled()
、現在の CPU のローカル割り込みが無効になっていることを通知しますが、割り込みハンドラーは他の CPU によって引き続き呼び出されるため、割り込みハンドラーで割り込みステータス レジスタがクリアされます。ポーリング コードは、割り込みステータス レジスタの間違った値をチェックし、間違った処理を行うようになりました。
2 に答える
あなたはそれを間違っています。割り込みを 1 つの CPU で処理するように制限しないでください。代わりに、spin_lock_irqsave を使用してコード パスを保護してください。これは、同じ CPU と複数の CPU の両方で機能します。
関連する API については、 http://www.mjmwired.net/kernel/Documentation/spinlocks.txtを参照してください。使用法を説明する Linux Journal のすばらしい記事は次のとおりです: http://www.linuxjournal.com/article/5833
私はARMの経験がありませんが、x86では、特定の割り込みが/proc/irq/<number>/smp_affinityを介して1つのプロセッサでのみ呼び出されるように調整できます-ユーザー空間から設定-番号を気にするirqに置き換えますabout - これは本質的に一般的なもののように見えます。設定する値は、先頭に 0x を付けずに 16 進数で表したビット マスクであることに注意してください。つまり、CPU 0 が必要な場合は 1 に設定し、CPU 1 の場合は 2 に設定します。このメカニズムを使用する irqbalance と呼ばれるプロセスに注意してください。
しかし、なぜあなたはこれをしているのですか?割り込みから呼び出されたかどうかを知りたい場合は、in_interrupt() のような名前のインターフェイスを利用できます。割り込みコンテキストから呼び出される可能性のあるコードからブロッキング関数を呼び出さないようにするために使用しました。