【】SRIOV:智能网卡就靠它了!( 三 )


------------------------------------------------------------------------------
Deep Dive
HW Blocks for virtio Full HW offloading
在一般的情况下 , 厂家的网卡PF创建VF的时候都使用自己专用的ring layout , 但是在virtio full HW offloading中使用virtio的 ring layout 。
【】SRIOV:智能网卡就靠它了!
文章图片

文章图片

HW Blocks for virtio Full HW offloading
【】SRIOV:智能网卡就靠它了!
文章图片

文章图片

对于Full HW offloading的网卡 , 都要使用vfio-pci的kernel驱动进行virtio full hw offloading的设备访问 , 在Host和Guest中都一样 。
下面的Full pciture , 可以看出来数据通路和控制通路的区别 。
【】SRIOV:智能网卡就靠它了!
文章图片

文章图片

来讨论一下网卡如何访问Guest的应用的queue 。网卡和Guest 之间的内存映射应该先建立 , 然后才能DMA 。为了建立DMA的mapping , guest的PMD的驱动使用ioctl命令去配置DMA和vfio 。这个时候 , iommu主要是映射 GIOVA到GPA之后 , vIOMMU会把GPA翻译成HVAGuest这边就建立了GIOVA到HVA的映射同样 , 在host side , VFIO建立了GIOVA到HPA的映射网卡开始使用GIOVA , 这样它就可以访问到guest application使用的HPA 。一旦我们设置了guest应用的virtqueue , HW就可以直接去访问它们 。
对于控制路径:virtio-net-pmd和guest kernel的VFIO通信 。Guest的VFIO和vfio-pci交互Guest kernel的vfio-pci驱动和QEMU的vfio设备通过虚拟的PCIE bus交互 。QEMU的vfio设备访问host kernel的VFIO (通过ioctl)Host kernel的VFIO和host kernel的vfio-pci交互 。Host kernel vfio-pci和真正的物理网卡交互 。
这个要求数据和控制路径都全部卸载到硬件 。这个需要网卡厂家完全在网卡中实现virtio的全部协议 , 一般是通过一个标准的接口如PCIE 。但是 , 一般来讲 , 每个厂家肯定有不同的实现机制 。
对于live migration , 仅仅实现了virtio的协议是不够的 , 比如dirty pages的tracking , 这个需要网卡和QEMU的API之间进行协作 。在Virtio的1.1的标准中 , 并没有这方面的定义 。
这里多说一下 , 对于一个PCIE设备进行live migration ,一般的需要处理的内容如下:在Guest中通过ioMMUtracking 脏页内存 。统一的VF和半虚拟化的驱动 。处理Guest和Host之间的IO共享内存 。Doorbell以及对应的PCIE寄存器和中断的映射 。
因此 , 如果你可以实现对这些内容的处理和监控 , 从Guest OS来看 , 你是不是个Virtio设备并不重要 。
vDPA
和前面的Full HW offloading对比 , vDPA就是可以使用一个厂家自定义的控制路径 , 但是在Guest面前又是一个标准的virtio设备 。因此就需要一个在网卡私有控制和virtio之间的翻译 。
这里就引入了一个新机制 , mdev ,mediator device可以实现设备的仿真(软件虚拟化)和设备的中介(软件和硬件虚拟化) 。它可以在一个物理设备上暴露出多个虚拟设备 。mdev最早是用在GPU的虚拟化的场景 。Intel增加它对IOMMU的支持 。[6]
【】SRIOV:智能网卡就靠它了!
文章图片

文章图片

本质上 , vDPA在数据路径还是全部使用HW , 但是在控制路径上使用mdev的机制进行设备仿真 。


推荐阅读