11. 引導中斷¶
- 作者:
Sean V Kelley <sean.v.kelley@linux.intel.com>
11.1. 概述¶
在 PCI Express 上,中斷由 MSI 或入站中斷訊息(Assert_INTx/Deassert_INTx)表示。給定核心 IO 中的整合 IO-APIC 將來自 PCI Express 的傳統中斷訊息轉換為 MSI 中斷。如果 IO-APIC 被停用(透過 IO-APIC 表項中的掩碼位),則訊息會被路由到傳統 PCH。這種帶內中斷機制傳統上對於不支援 IO-APIC 的系統和引導過程是必需的。英特爾過去曾使用“引導中斷”一詞來描述這種機制。此外,PCI Express 協議描述了這種用於 I/O 裝置發出 PCI 風格電平中斷的帶內傳統有線中斷 INTx 機制。接下來的段落描述了核心 IO 處理 INTx 訊息路由到 PCH 的問題以及 BIOS 和作業系統中的緩解措施。
11.2. 問題¶
當帶內傳統 INTx 訊息被轉發到 PCH 時,它們會觸發一個新的中斷,而作業系統很可能缺少相應的處理程式。當一箇中斷長時間未被處理時,Linux 核心會將其記錄為虛假中斷(Spurious Interrupts)。當 IRQ 達到特定計數並出現“無人關心”(nobody cared)錯誤時,Linux 核心會停用該 IRQ。這個被停用的 IRQ 現在會阻止可能共享同一 IRQ 線的現有中斷的有效使用。
irq 19: nobody cared (try booting with the "irqpoll" option)
CPU: 0 PID: 2988 Comm: irq/34-nipalk Tainted: 4.14.87-rt49-02410-g4a640ec-dirty #1
Hardware name: National Instruments NI PXIe-8880/NI PXIe-8880, BIOS 2.1.5f1 01/09/2020
Call Trace:
<IRQ>
? dump_stack+0x46/0x5e
? __report_bad_irq+0x2e/0xb0
? note_interrupt+0x242/0x290
? nNIKAL100_memoryRead16+0x8/0x10 [nikal]
? handle_irq_event_percpu+0x55/0x70
? handle_irq_event+0x4f/0x80
? handle_fasteoi_irq+0x81/0x180
? handle_irq+0x1c/0x30
? do_IRQ+0x41/0xd0
? common_interrupt+0x84/0x84
</IRQ>
handlers:
irq_default_primary_handler threaded usb_hcd_irq
Disabling IRQ #19
11.3. 條件¶
目前,使用執行緒化中斷(threaded interrupts)是最有可能觸發此問題的情況。執行緒化中斷可能在 IRQ 處理程式喚醒後無法重新啟用。這些“一次性”(one shot)條件意味著執行緒化中斷需要保持中斷線被遮蔽,直到執行緒處理程式執行完畢。特別是在處理高資料率中斷時,執行緒需要執行完成;否則,由於發出中斷的裝置中斷仍然活躍,一些處理程式最終會發生堆疊溢位(stack overflows)。
11.4. 受影響的晶片組¶
傳統中斷轉發機制目前存在於許多裝置中,包括但不限於 AMD/ATI、Broadcom 和 Intel 的晶片組。透過以下緩解措施所做的更改已應用於 drivers/pci/quirks.c。
從 ICX 開始,核心 IO 裝置中不再有任何 IO-APIC。IO-APIC 只存在於 PCH 中。連線到核心 IO 的 PCIe 根埠的裝置將使用原生的 MSI/MSI-X 機制。
11.5. 緩解措施¶
緩解措施以 PCI quirk 的形式存在。首選方法是首先識別並利用一種方式來停用路由到 PCH。在這種情況下,可以新增一個用於停用引導中斷生成的 quirk。 [1]
- Intel® 6300ESB I/O 控制器集線器
- 備用基地址暫存器
BIE: 引導中斷啟用
0
引導中斷已啟用。
1
引導中斷已停用。
- 基於 Intel® Sandy Bridge 至 Sky Lake 的 Xeon 伺服器
- 一致性介面協議中斷控制
- dis_intx_route2pch/dis_intx_route2ich/dis_intx_route2dmi2
當此位被設定時,從 Intel® Quick Data DMA/PCI Express 埠接收到的本地 INTx 訊息不會路由到傳統 PCH——它們要麼透過整合 IO-APIC 轉換為 MSI(如果 IO-APIC 掩碼位在相應條目中清除),要麼不導致任何進一步操作(當掩碼位設定時)。
在無法直接停用路由的情況下,另一種方法是利用 PCI 中斷引腳到 INTx 路由表,以便預設將中斷處理程式重定向到重新路由的中斷線。因此,在無法停用此 INTx 路由的晶片組上,Linux 核心會將有效中斷重新路由到其傳統中斷。這種處理程式的重定向將防止虛假中斷檢測的發生,虛假中斷檢測通常會因未處理計數過多而停用 IRQ 線。 [2]
配置選項 X86_REROUTE_FOR_BROKEN_BOOT_IRQS 用於啟用(或停用)將中斷處理程式重定向到 PCH 中斷線。此選項可以透過 pci=ioapicreroute 或 pci=noioapicreroute 進行覆蓋。 [3]
11.6. 更多文件¶
在幾份資料手冊(下面的 6300ESB 和 6700PXH)中有關於傳統中斷處理的概述。雖然大體相同,但它提供了關於其隨晶片組處理演變的見解。
11.6.1. 停用引導中斷的示例¶
Intel® 6300ESB I/O 控制器集線器 (文件 # 300641-004US) 5.7.3 引導中斷 https://www.intel.com/content/dam/doc/datasheet/6300esb-io-controller-hub-datasheet.pdf
Intel® Xeon® 處理器 E5-1600/2400/2600/4600 v3 產品家族資料手冊 - 卷 2: 暫存器 (文件 # 330784-003) 6.6.41 cipintrc 一致性介面協議中斷控制 https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/xeon-e5-v3-datasheet-vol-2.pdf
11.6.2. 處理程式重新路由的示例¶
Intel® 6700PXH 64 位 PCI 集線器 (文件 # 302628) 2.15.2 PCI Express 傳統 INTx 支援和引導中斷 https://www.intel.com/content/dam/doc/datasheet/6700pxh-64-bit-pci-hub-datasheet.pdf
如果您有任何未解答的傳統 PCI 中斷問題,請給我發郵件。
- 此致,
Sean V Kelley sean.v.kelley@linux.intel.com