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


【】SRIOV:智能网卡就靠它了!
文章图片

文章图片

vhost-vfio , 从QEMU的观点来看 , vhost-vfio就是一个新类型的QEMU网路后端用来支持virtio-net的设备 。从kernel的观点来看 , vhost-vfio就是vhost-mdev设备的用户态驱动 。它的主要作用是:设置vhost-mdev设备:打开vhost-mdev的设备文件 , 用来传递vhost的命令到设备去 , 得到vhost-mdev设备的container , 用来传递DMAsetup的命令到VFIO container 。从virtio-net设备接收数据路径卸载的命令( set/get virtqueue 状态 , set 脏页日志 , 功能协商等等) , 并把他们翻译vhost-mdev的ioctl 。接受vIOMMU map和umap的命令并同VFIO DMA的ioctl执行 。下面这个图在原文中是错误的 , 我基于自己的理解在使用最小的代价作做个修改 。Redhat的blog比较坑爹 , 不能反馈 , 有认识的大侠可以去反馈一下 。
这里有一个关键信息需要强调 , 对于vDPA的实现 , 我们这里使用的基于SRIOV的网卡VF , 但是这里并没有强制要求SRIOV , 网卡厂家可以使用其他的方式在一个物理网卡上运行多个vDPA的实例 。在这里SRIOV的VF实现是基于Virtio的 , 只要提供基于标准的vritio layout , 这里并不局限于设备的类型 。比如 , 在Beta-Metal设计中 , vDPA的设备可以是多个PF 。
比如在Scalable IOV中 , 网卡并不是分解成VF , 而是QP级别的粒度 。
【】SRIOV:智能网卡就靠它了!
文章图片

文章图片

从下到上在回顾一下vDPA的框图:在硬件层是vDPA设备 , 它可以使用私有的控制路径初始化virtqueue , 在virtio Full hardware offloading时 , 这个设备是virtio-net 设备 。virtio-mdev设备实现了vDPA设备的具体功能 , 就是我们如何卸载数据路径 。virtio-mdev设备接受virtio-mdev基于API的传输命令 , 并完成mediated 设备的翻译 , 仿真或者中介的功能 。virtio-mdev 传输API通过mdevbus提供了一个统一的API给用户态(qemu中)或者kernel的驱动 。它本质上是一个driver的抽象设备 。对于host用户空间 ,vhost-mdev把自己注册成一个新的mdev设备 , 来bridge 用户空间的vhost驱动和virtio-mdev设备 。它通过ioctl接受vhost-net兼容的命令 , 并把他们翻译成virtio-mdev的传输API 。它同时属于VFIO group可以设置DMA 。vhost-vfio是一个host 用户态的驱动 , 它和qemu中的virtio 设备一起对上面的VM提供一个虚拟化的virtio设备(例如virtio-pci). 从vIOMMU发出的DMA mapping 请求被转发到VFIO的contatier 句柄 。而virtio设备的启动和配置都是通过vhost-mdev 来完成 。在Guest中 , VFIO 会暴露设备和DMA API给用户态的驱动 , 这个例子是virtio-net的PMD 。
【【】SRIOV:智能网卡就靠它了!】vDPA DPDK 的实现
DPDK从18.05开始支持vDPA 。它是基于vhost-user的协议提供了一个后端实现 。DPDK的实现主要目的是实现一个可以DEMO的 , 为了最终实现一个更见标准的 , 在kernel里面的 , 基于mdev框架的实现 。
这里有两个新的组件:
vDPA驱动 , 用户态驱动来控制vDPA设备硬件 。
vDPA框架 , 提供vhost-user socket和vDPA驱动的连接 。
DPDK vDPA框架提供一系列的设备回调函数 , 由网卡厂家实现 , 这些函数被vhost-user调用来创建数据路径 。
【】SRIOV:智能网卡就靠它了!
文章图片

文章图片

在vDPA设备支持热迁移的脏页他tacking的场景下 , 它的diver可以也会实现migration_done这样的回调函数 。否则 , vDPA框架可以在热迁移的时候把路径切换到软件上来执行 。


推荐阅读