web-dev-qa-db-ja.com

Linux割り込みアフィニティ

SuSE Linux Enterprise Server 11sp2を実行しているHPDL980があります。

このマシンは、他のマシンと同期するためにクロック信号を送信するために使用されるPCIeデジタルIOカードをホストします。

topを実行すると、プロセスの1つが「コマンド」で表示されます[irq/28-pci7230]およびtopは、このプロセスがCPU8で実行されていることを示しています。 pci72はデジタルIOカードです。もし私ならcat/proc/interrupts、これはCPU0のすべての割り込みを表示します。

ここで何が起こっているのか説明できますか? topのエントリは、割り込みがCPU8によって処理されていることを示しているが、/ procであるという印象を受けました。/interruptsは別のことを示唆しているようです。

1
JRT

割り込みの上半分と下半分を混同しています。割り込みの上半分が下半分とは異なるコアで実行されるのは完全に正常です。ハードウェア割り込みが発生すると、たまたま実行されていたコンテキストになります。ランダムな、おそらく重要なジョブをハイジャックしないように、そのコンテキストをできるだけ早く解放することが重要です。

「Linux(および他の多くのシステム)は、割り込みハンドラーを2つに分割することでこの問題を解決します。いわゆる上半分は、割り込みに実際に応答するルーチン、つまりrequest_irqに登録するルーチンです。下半分はルーチンです。上半分のハンドラーと下半分の大きな違いは、下半分の実行中にすべての割り込みが有効になることです。そのため、より安全な時間に実行されます。通常のシナリオでは、上半分はデバイスデータをデバイス固有のバッファーに保存し、下半分をスケジュールして終了します。この操作は非常に高速です。下半分は、覚醒プロセスなど、その他の必要な作業を実行します。別のI/O操作を開始するなど。この設定により、下半分がまだ機能している間に、上半分が新しい割り込みを処理できるようになります。」 -- 上半分と下半分

割り込み自体はスケジュールされていません。割り込みが到着すると、割り込みが到着します。 [irq/28-pci7230]カーネルスレッドは「実際の作業」を行うようにスケジュールされています。

3
David Schwartz