當前數據中心服務器,CPU基本都是基於PCIE總線和各種設備(例如,內存、顯卡和網卡等)相連。而各種PCIE設備采用 MSIX(Message Signaled Interrupt eXtended - 基於消息的信號中斷擴展)將中斷信號發送給CPU。我們知道MSI最多支持32個中斷向量號,而MSI-X中斷向量數目最大為2048。那我們編程時如何獲取、申請、控制這些中斷向量資源呢,本文將為你揭開神秘的面紗。
基於lscpi 命令可以輕易獲取到當前系統中PCI 設備的能力,而MSI-X 能力是PCIE設備眾多能力中的一個。下面將基於網卡設備查看其 MSI-X Capability配置。
lspci -s <BDF> -vvv 顯示pcie設備配置空間信息
從上圖PCIE設備的配置空間信息可以看出,該PCIE設備支持兩個Bar地址空間(Region 0 & Region 3),
下圖展示瞭MSIX Capability在配置空間中的位置,其大小為3個DWORD,即12字節:
1365f65199e87e2948b9a395dabc7948
上圖第二個紅框關於MSI-X Capability的標準如下:
9c117633f5d10987cc3d3c346175bdce
40e3366df4eaeb7835cb44989a4485f5
如何獲取MSIX Capability的信息呢?下面將基於內核代碼解釋讀取第一個DOWRD 中 Size of the MSI-X Table(即中斷向量總數 Vector Number )的過程。
可以基於接口 pci_read_config_word 來讀取PCIE EP(end point)設備的配置空間信息。下面代碼用該接口讀取MSIX Capability 的第一個DWORD 中的Message Control(16~31 位),從而獲取到當前 PCIE EP 真實支持中斷號數量。例如上面PCIE 網卡設備的 num_vectors 為130(129+1)。
#include <linux/pci.h>
/* MSI-X registers (in MSI-X capability) */
#define PCI_MSIX_FLAGS 2 /* Message Control */
#define PCI_MSIX_FLAGS_QSIZE 0x07FF /* Table size */
struct pci_dev *pdev = pci_dev;
u16 msix_config;
int num_vectors;
// pdev 為 PCIE 設備,pdev->msix_cap為設備配置空間中MSIX Capability的起始位置(PCI_MSIX_FLAGS表示讀取Message Control)
// 讀取到的 message control 寄存器放置於 msix_config 變量
pci_read_config_word(pdev, pdev->msix_cap + PCI_MSIX_FLAGS, &msix_config);
num_vectors = ((msix_config & PCI_MSIX_FLAGS_QSIZE) + 1);
pr_info("MSIX: num_vectors=%dn", num_vectors);
下一篇
最近諾安成長混合這隻基金儼然已經成為瞭一隻“網紅基金”瞭,熱度持續很久依舊絲毫未減。這支曾經凈值一度暴漲超過200%,出現...
夏日和煦,生机勃勃。为进一步优化网点硬件设施,提升金融服务水平,改善客户体验,6月2日,平安银行深圳梅林支行重装开业, ...