使用消息信号中断的 RSS
微型端口驱动程序可以支持消息信号中断 (MSI) 以提高 RSS 性能。 NIC 允许 NIC 在处理接收的数据的 CPU 上请求中断。 有关 NDIS 对 MSI 的支持的详细信息,请参阅 NDIS MSI-X。
下图演示了具有 MSI-X 的 RSS。
在图中,虚线箭头表示对不同连接进行处理。 使用 MSI-X 的 RSS 允许 NIC 中断正确的连接 CPU。
每个中断重复以下过程:
The NIC:
使用 DMA 使用接收的数据填充缓冲区。
微型端口驱动程序在初始化期间分配了共享内存中的接收缓冲区。
计算哈希值。
将缓冲区排队到 CPU,并为微型端口驱动程序提供队列分配。 例如,在收到一定数量的数据包后,NIC 可以循环执行步骤 1-3 和 DMA 的 CPU 分配列表。 特定机制留给 NIC 设计。
使用 MSI-X 中断与非空队列关联的 CPU。
NIC 可以随时填充其他接收缓冲区并将其添加到队列,但在微型端口驱动程序为该 CPU 启用中断之前不会再次中断该 CPU。
NDIS 在当前 CPU 上调用微型端口驱动程序的 ISR ( MiniportInterrupt) 。
ISR 禁用当前 CPU 上的中断,并将当前 CPU 上的 DPC 排队。
当 DPC 在当前 CPU 上运行时,其他 CPU 仍可能发生中断。
NDIS 为每个排队的 DPC 调用 MiniportInterruptDPC 函数。 每个 DPC:
- 为其队列中所有接收的缓冲区生成接收描述符,并指示驱动程序堆栈上的数据。 有关详细信息,请参阅 指示 RSS 接收数据。
- 为当前 CPU 启用中断。 此中断已完成,进程会再次启动。 请注意,无需原子操作即可跟踪其他 DPC 的进度。