次のメッセージの意味を理解しようとしています。
irq N:nobody cared (try booting with the "irqpoll" option)
これは、IRQハンドラーが割り込みを受け取っても応答を処理しないことを意味しますか?または、スケジューラーがirqハンドラーの呼び出しに失敗しましたか?
これはどのような状態で起こっていますか?
これは、そのirqにハンドラーが登録されていないか、共有割り込みの場合にirqが(彼がサポートしているハードウェアから)彼のためではなかったことを示すステータスが返されることを意味します。おそらく障害のあるHW/FWまたはバグのあるドライバーです。
理想的には、上記のメッセージの後にスタックトレースが続く必要があります。これは、問題の原因となっているサブシステムを特定するのに役立ちます。このメッセージは、オーバーヘッドが原因で割り込みハンドラがスタックし、戻らなかったため、システムがIRQ#Xを無効にしたことを意味します。これは、バグのあるファームウェアの場合に見られます。
irqpoll
オプションをgrub.confに追加する必要があります。つまり、割り込みが処理されない場合は、既知のすべての割り込みハンドラーで適切なハンドラーを検索し、各タイマー割り込みのすべてのハンドラーもチェックします。これは、ファームウェアが壊れているシステムを実行する場合に役立つことがあります。 grub.confのカーネルコマンドラインは次のようになります。
カーネル/ vmlinuz-バージョンroroot =/dev/sda1静かなirqpoll
実行可能な最小限のQEMUの例
QEMUには、割り込みを生成するedu
という教育用デバイスがあり、これを調べるのに最適です。
まず、 割り込みを正しく処理するための最小限のLinux PCIデバイスドライバー を作成しました。
これで、コードからrequest_irq
とfree_irq
をコメントアウトすることで、エラーを簡単に生成できます。
次に、IRQを生成するユーザーランドプログラムを実行すると、次のようになります。
irq 11: nobody cared (try booting with the "irqpoll" option)
スタックトレースが続きます。
他の人が述べたように:未処理のIRQ。
ここを参照してください:
static inline int bad_action_ret(irqreturn_t action_ret)
{
if (likely(action_ret <= (IRQ_HANDLED | IRQ_WAKE_THREAD)))
return 0;
return 1;
}
私の場合、ネットワークカードに短期間に数十億のエラーが発生したため、ドライバをリロードした後。
modprobe -r ixgbe && modprobe ixgbe
lspciは、「カード」があった未知のデバイスを示しました
再起動後、カードは消え、二度と表示されなくなりました。
そのため、エラーはハードウェアの障害も示している可能性があります。