具有硬件队列的 RSS

具有硬件队列的 RSS 可提高相对于单个硬件接收队列解决方案的 RSS 的系统性能。 支持硬件队列的 NIC 将收到的数据分配给多个接收队列。 接收队列与 CPU 相关联。 NIC 根据哈希值和间接表将接收的数据分配给 CPU。

下图展示了带有 NIC 接收队列的 RSS。

展示 RSS 和 NIC 接收队列的示意图。

在图中,虚线箭头表示接收处理的备用路径。 RSS 无法控制接收初始 ISR 调用的 CPU。 驱动程序不必对数据进行排队,因此它可以立即在正确的 CPU 上计划初始 DPC。

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

  1. The NIC:

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

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

    2. 计算哈希值。

    3. 对 CPU 的缓冲区进行排队,并向微型端口驱动程序提供队列分配。

      例如,NIC 可以在收到一些数据包后循环步骤 1-3 和 DMA CPU 分配列表。 特定机制留给 NIC 设计。

    4. 中断系统。

      处理系统在一个中断中接收到的缓冲区,并将其分配到多个 CPU。

  2. NDIS 在系统确定的 CPU 上调用微型端口驱动程序的 MiniportInterrupt 函数 (ISR)。

  3. 微型端口驱动程序请求 NDIS 对具有非空队列的每个 CPU 进行排队延迟过程调用(DPC)。

    请注意,在驱动程序启用中断之前,所有 DPC 都必须完成。 此外,请注意,ISR 可能在没有要处理的缓冲区的 CPU 上运行。

  4. NDIS 为每个排队的 DPC 调用 MiniportInterruptDPC 函数。 给定 CPU 上的 DPC:

    1. 生成其队列中所有接收缓冲区的接收描述符,并指示驱动程序堆栈上的数据。

      如需详细信息,请参阅 指示 RSS 接收数据

    2. 如果这是最后一个完成的 DPC,则启用中断。 此中断已完成,进程将再次启动。 驱动程序必须使用原子操作来标识最后完成的 DPC。 例如,驱动程序可以使用 NdisInterlockedDecrement 函数实现原子计数器。