虚拟功能解除序列
支持单根 I/O 虚拟化 (SR-IOV) 的网络适配器必须能够支持以下硬件组件:
一个 PCI Express (PCIe) 物理功能 (PF)。 PF 始终存在于网络适配器上,并附加到 Hyper-V 父分区。
有关此硬件组件的详细信息,请参阅 SR-IOV 物理功能 (PF)。
一个或多个 PCIe 虚拟函数 (VF)。 必须先初始化每个 VF 并将其附加到 Hyper-V 子分区,然后客户操作系统的网络组件才能通过 VF 发送和接收数据包。
有关此硬件组件的详细信息,请参阅 SR-IOV 虚拟函数 (VFs)。
在 VF 被拆解及其资源释放之前,虚拟化堆栈会通知虚拟 PCI (VRI) 虚拟服务提供商 (VSP)。 此 VSP 在 Hyper-V 父分区的管理操作系统中运行。 通知会告知 VPCI VSP,VF 将被拆卸并从子分区中分离。 在子分区的来宾操作系统中运行的 VMI 虚拟服务客户端 (VSC) 通过虚拟机总线 (VMBus) 将消息发送到 VMI 虚拟服务客户端 (VSC)。 这些消息请求 VPCI VSC 正常删除 VF 连接到子分区时暴露的 VF 网络适配器。 这会导致 NetVSC 从 VF 微型端口驱动程序取消绑定,并停止驱动程序。 此时,子分区中的数据包流量从 VF 数据路径迁移到基于软件的合成数据路径。 有关这些数据路径的详细信息,请参阅 SR-IOV 数据路径。
故障转移到合成数据路径完成后,VF 会被拆解,并释放其资源。 下图显示了 VF 拆解所涉及的步骤。
NDIS、虚拟化堆栈和 PF 微型端口驱动程序在 VF 拆解序列中执行以下步骤:
虚拟化堆栈将虚拟机 (VM) 网络适配器的媒体访问控制 (MAC) 和虚拟 LAN (VLAN)筛选器移动到附加到 PF 的默认虚拟端口 (VPort)。 VM 网络适配器在子分区的客户操作系统中公开。
将筛选器移动到默认 VPort 后,综合数据路径对传入和传出来宾操作系统中运行的网络组件的网络流量完全正常运行。 PF 微型端口驱动程序指示默认 PF VPort 上收到的数据包,该端口使用综合数据路径来指示向客户操作系统发送的数据包。 同样,来自客户操作系统的所有传输数据包都通过综合数据路径路由,并通过默认 PF VPort 传输。
虚拟化堆栈通过向 PF 微型端口驱动程序发出 OID_NIC_SWITCH_DELETE_VPORT 的对象标识符 (OID) 设置集请求来删除附加到 VF 的 VPort。 微型端口驱动程序释放与 VPort 关联的任何硬件或软件资源,并完成 OID 请求。
有关详细信息,请参阅 删除虚拟端口。
在解除分配 VF 资源之前,虚拟化堆栈会请求 VF 的 PCIe 函数级别重置 (FLR)。 堆栈通过向 PF 微型端口驱动程序发出 OID_SRIOV_RESET_VF 的 OID 设置请求来执行此操作。 FLR 使 SR-IOV 网络适配器上的 VF 进入静止状态,并清除 VF 的任何挂起中断事件。
重置 VF 后,虚拟化堆栈通过向 PF 微型端口驱动程序发出 OID_NIC_SWITCH_FREE_VF 的 OID 设置请求来解除分配 VF 资源。 这会导致微型端口驱动程序释放与 VF 关联的硬件资源。