阅读本文前需对NVMe/PCIe/MSI有一定的了解

INTXMSI

为什么在越来越多的PCIe外设驱动中摒弃INTx,而采用MSI/MSI-X?概括有三:

1. 单个设备INTx最多支持4个中断,MSI支持最多32个中断,MSI-X可以达到更多。

2. INTx需要专门的中断pin

3. INTx随时发生,MSI发生在DMA完成后,对上下文切换影响较小。

MSI-X如何发生

        PCIe设备发出MSI/MSI-X中断请求都是向Message address所在地址写Message data字段包含的数据,当系统软件初始化时,PCIe设备需要初始化MSI-X capabilities结构的Message AddressMessage Data字段(由host中断控制器驱动填写),并使能MSI-X。如图为Message data字段定义:  

浅谈NVMe与MSI-X

1 message data

       Vector字段表示这个中断请求使用的中断向量,总线事务在提交中断请求的同时,将中断向量也通知给处理器。


MSI-XNVMe双剑合璧

   不知道有多少人为NVMe协议中CQ vector(图1)而纠结过,反正笔者曾被它迷惑多时。简而言之,这个vector不同于device-irq,亦不同于EPIC(中断控制器)vector,它仅和NVMe fireware交互。

浅谈NVMe与MSI-X

1 NVMe cq vector

       Host向中断控制器申请三个中断,读PCIe配置空间MSI-X capbility table如图:

浅谈NVMe与MSI-X

2 PCIe配置空间

   从图2中可以看出MSI-X已使能,MSG Address: 0xC0041740, 三个中断的MSG Data依次为:0、0x20、0x40。对于设备来说写0、0x20、0x40host address0xC0041740会产生三个不同的中断。对于Host EPIC(中断控制器)来说,它们分别叫:vector address/vector value

   那么Host怎么知道中断来自哪个CQ呢?其实图1cq-vector和图2MSI-X table是一一对应的(比如创建cq的时候interrupt vector = 1,设备就知道了如果这个q有完成状态就写0x200xC0041740,这时host epic就根据MSG data把中断挂到具体的中断处理函数)。如图3为中断处理的整个流程:

浅谈NVMe与MSI-X

3中断处理流程

相关文章:

  • 2021-05-29
  • 2021-12-29
  • 2021-06-27
  • 2021-08-28
  • 2021-06-22
  • 2021-07-21
  • 2021-11-28
  • 2021-11-25
猜你喜欢
  • 2022-12-23
  • 2021-06-23
  • 2021-10-07
  • 2021-11-20
  • 2021-08-15
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案