包含消息信号中断的 RSS

微型端口驱动程序可以支持消息信号中断(MSI)以提高 RSS 性能。 MSIS 使 NIC 能够请求 CPU 上的中断,该中断将处理收到的数据。 有关对 MSI 的 NDIS 支持的详细信息,请参阅 NDIS MSI-X

下图演示了具有 MSI-X 的 RSS。

图示网络堆栈中使用 MSI-X 的 RSS。

在图中,虚线箭头表示对不同连接的处理。 具有 MSI-X 的 RSS 允许 NIC 向正确的 CPU 发出中断请求以处理连接。

每个中断都将重复以下过程:

  1. The NIC:

    1. 使用 DMA 填充已接收数据的缓冲区。

      微型端口驱动程序在初始化期间在共享内存中分配了接收缓冲区。

    2. 计算哈希值。

    3. 将缓冲区分配到 CPU,并向小型端口驱动程序提供队列分配信息。 例如,NIC 可以在收到一些数据包后循环步骤 1-3 和 DMA CPU 分配列表。 特定机制留给 NIC 设计。

    4. 使用 MSI-X 时,会中断与非空队列关联的 CPU。

  2. NIC 可以填充额外的接收缓冲区,并随时将其添加到队列中,但在小端口驱动程序启用该 CPU 的中断之前不会再次中断该 CPU。

  3. NDIS 在当前 CPU 上调用微型端口驱动程序的 ISR ( MiniportInterrupt)。

  4. ISR 在当前 CPU 上禁用中断,并将 DPC 排在当前 CPU 上。

    在当前 CPU 上运行 DPC 时,其他 CPU 仍可能发生中断。

  5. NDIS 为每个排队的 DPC 调用 MiniportInterruptDPC 函数。 每个 DPC:

    1. 生成其队列中所有接收缓冲区的接收描述符,并指示驱动程序堆栈上的数据。 如需详细信息,请参阅 指示 RSS 接收数据
    2. 为当前 CPU 启用中断。 此中断已完成,进程将再次启动。 请注意,跟踪其他 DPC 的进度不需要原子操作。