NDIS VMQ 实时迁移支持

若要支持实时迁移,可以在任何指令或挂起的 I/O 边界暂停虚拟机 (VM) 。 也就是说,VM 可能无法完成挂起的接收请求。 因此,网络虚拟服务提供商 (VSP) 会将接收到的所有数据包返回到 VM 未返回的基础网络适配器。

注意 在 Hyper-V 中,子分区也称为 VM。

在另一台主机上重启 VM 时,新主机上的网络 VSP 将处理恢复的 VM 返回的接收数据包,并且不会将它们传递到微型端口驱动程序中的新基础。 迁移完成后,将释放与 VM 关联的接收队列,并且可以将其重新用于另一个 VM。

注意 新的网络适配器可能不支持 VMQ。

当 NDIS 请求微型端口驱动程序释放 VMQ 接收队列时,它遵循以下步骤:

  1. 网络适配器停止 DMA 数据传输,以接收与接收队列关联的缓冲区,之后队列必须进入“DMA 已停止”状态。 网络适配器在收到 OID_RECEIVE_FILTER_CLEAR_FILTER OID 请求以清除接收队列上的最后一个设置筛选器时,它可能停止了 DMA 活动。

  2. 微型端口驱动程序生成一个NDIS_STATUS_RECEIVE_QUEUE_STATE状态指示,并将 NDIS_RECEIVE_QUEUE_STATE 结构的 QueueState 成员设置为 NdisReceiveQueueOperationalStateDmaStopped,以通知 NDIS DMA 传输已停止。

  3. 微型端口驱动程序等待该队列返回给微型端口驱动程序的所有指示的接收数据包。

  4. 微型端口驱动程序通过调用 NdisFreeSharedMemory 释放它为与队列关联的网络适配器接收缓冲区分配的所有共享内存。

  5. 微型端口驱动程序完成 OID_RECEIVE_FILTER_FREE_QUEUE OID 请求以释放接收队列。

有关队列状态的详细信息,请参阅 NDIS VM 队列状态