首页 理论教育使能LinuxMSI-X中断机制,提升性能

使能LinuxMSI-X中断机制,提升性能

【摘要】:在Linux系统中,如果PCI/PCIe设备需要使用MSI-X中断机制,需要调用pci_enable_msix函数,pci_enable_msix函数调用的大多数函数与pci_enable_msi类似,本节并不会重复解释这些函数,该函数的实现如源代码15-14所示。下文将以Intel的e1000e网卡驱动程序说明如何使用MSI-X中断机制挂接中断服务例程。源代码15-15 e1000e_set_interrupt_capability函数当e1000e_set_interrupt_capability函数返回后,MSI-X中断机制使用的中断向量将被保存在adapter->msix_entries数组中,之后e1000_open→e1000_request_irq→e1000_request_msix函数将多次调用request_irq函数将e1000e使用的中断服务例程挂接到系统中断服务程序中,e1000_request_msix函数的实现如源代码15-16所示。

在Linux系统中,如果PCI/PCIe设备需要使用MSI-X中断机制,需要调用pci_enable_msix函数,pci_enable_msix函数调用的大多数函数与pci_enable_msi类似,本节并不会重复解释这些函数,该函数的实现如源代码15-14所示。

源代码15-14 pci_enable_msix函数

与pci_enable_msi_block函数不同,pci_enable_msix函数的入口参数包括一个msix_entry结构的entries链表(在使用这个entries链表之前需要将msix_entry.entry参数赋值),而nvec参数保存entries链表的长度。该函数首先对入口参数进行检查,然后调用msix_capabil-ity_init函数为PCIe设备分配多个中断向量号。msix_capability_init函数的实现与msi_capabil-ity_init函数的实现方法类似,本章对此不做进一步描述。

该函数成功返回后,PCIe设备将得到多个中断向量,并将结果放入pci_dev→msi_list和entries链表中,之后PCIe设备的Linux驱动程序可以使用多个request_irq函数注册相应的中断服务例程。

下文将以Intel的e1000e网卡驱动程序说明如何使用MSI-X中断机制挂接中断服务例程。在Linux中,与e1000e网卡相关的驱动程序在./drivers/net/e1000e/netdev.c文件中。其中MSI-X中断机制的初始化在e1000_probe→e1000_sw_init→e1000e_set_interrupt_capability函数中,该函数的实现如源代码15-15所示。(www.chuimin.cn)

源代码15-15 e1000e_set_interrupt_capability函数

当e1000e_set_interrupt_capability函数返回后,MSI-X中断机制使用的中断向量将被保存在adapter->msix_entries数组中,之后e1000_open→e1000_request_irq→e1000_request_msix函数将多次调用request_irq函数将e1000e使用的中断服务例程挂接到系统中断服务程序中,e1000_request_msix函数的实现如源代码15-16所示。

源代码15-16 e1000_request_msix函数

e1000_request_msix函数将“接收完成中断请求e1000_intr_msix_rx”、“发送完成中断请求e1000_intr_msix_tx”和“其他中断请求e1000_msix_other”分别注册。当有中断事件发生时,驱动程序不需要读取中断状态寄存器之后再进行处理,从而有效降低了系统延时。