割り込みが IO-APIC エッジ割り込みか IO-APIC レベル割り込みかを判断するには?

割り込みが IO-APIC エッジ割り込みか IO-APIC レベル割り込みかを判断するには?

x86 Linuxの内容を見ると、/proc/interrupts一部の割り込みはIO-APIC-edge、他の割り込みはですIO-APIC-level

割り込みの種類を決定する要素が、割り込み生成デバイスか、割り込みコントローラ(APIC)なのか、Linuxカーネルなのか、またはBIOSなのかを知りたいのです。

(疑問の理由は、PCIカードをデュアルプロセッサPentium IIIシステム(IO-APIC-levelデュアルプロセッサXeonシステムとして認識)からデュアルプロセッサXeonシステム(デュアルプロセッサXeonシステムとしてIO-APIC-edge認識)に移動したためです。

答え1

例えば82093AAIO-APIC指定できる書き込み可能ビットを持つI / Oリダイレクトテーブルレジスタ(IOREDTBL)があります。トリガーモード(水平または端に敏感です)これらのレジスタはstruct IO_APIC_route_entryカーネルソースコードに反映されているようです。

2.6.18カーネルソースコードをさらに詳しく見ると、見つかったすべてのsetup_IO_APIC_irqs(..)IO-APICと各IO-APICのすべてのIRQラインを繰り返し、io_apic_write(..)APICレジスタに書き込む呼び出しを作成する関数を見つけることができます。

トリガーの種類は関数によって決定されMPBIOS_trigger(..)(呼び出しによってirq_trigger(..))、これは順番に変数を参照しているように見え、mp_irqsこの変数はいっぱいになるようですarch/x86_64/kernel/mpparse.c。このファイルは、一致するMP構成テーブルを読み取るようです。インテルマルチプロセッサー仕様

この仕様で引用すると、次のようになります。

The BIOS constructs the MP configuration data structures, presenting the 
hardware in a known format to the standard device drivers or to the 
hardware abstraction layer of the operating system.

したがって、カーネルはBIOSが提供する情報に基づいて割り込みトリガタイプを設定すると言いたいと思います。

注:中断に関するウィキペディア記事話す

The original PCI standard mandated shareable level-triggered interrupts.

(これは、衝突すると同時にエッジトリガ割り込みを送信する同じライン上の複数のデバイスで発生するようです。)これは、PCIデバイスではややIO-APIC-edge予期しないことです。

答え2

これを決定するのは変数ですlpfc_use_msi。 2に設定すると、modprobe.confIOの代わりにMSIを使用します。 「MSI割り込みモード」をお勧めします。

関連情報