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


在使用SRIOV中 , 一个网上的可以配置多个VF , 但是每个VF都有自己特定的内存空间(在Guest中) , 但是VF无法访问host上的mdev的空间 , 因此目前在使用SRIOV时 , 控制路径上和mdev相关的操作要经过PF , 或者只能是单向的mdev到VF 。未来的Scalable IOV会解决这个问题 。
至于VFIO的驱动框架 , 就是用户态对于PCIE设备的支持访问 , 这个框架可以支持各种设备 , 比如GPU. 这就意味着Guest上的用户态应用可以支持访问物理设备 。
MDEV包含了以下部分:
1.mediated core driver API
2.mediated device API
3. mdev-bus
4. management interface
【】SRIOV:智能网卡就靠它了!
文章图片

文章图片

Virtio-Mdev 框架
virtio-mdev框架的主要目的是提供给不同的vDPA网卡厂家一个标准的API来实现他们自己的控制路径 。mdev提供的框架可以支持vDPA实现数据和控制路径的分离 。数据路径硬化 , 控制路径在软件实现 。
这个驱动可以是用户态基于VFIO , 也可以是内核态基于virtio的 。在目前这个系列 , 主要关注基于vfio的用户态驱动 , 但是在未来也会讨论基于virtio的内核态驱动 , 比如支持AF_VIRTIO 。
这个驱动的实现也比较简单 , 本质上就是一些列的virtio-mdev的API 。主要包含:
.set/get 设备的配置空间
.set/get virtqueue的元数据:vring地址 , 大小和基地址
.kick一个特定的virtqueue
.为一个特定的virtqueue注册回调中断
.协商功能
.set/get 脏页日志
.启动/重置设备
vhost-mdev 是一个kernel的模块 , 主要功能是:转发用户空间的virtio 命令到virtio mdev的API重用VFIO的框架来准备DMA映射和解映射的用户空间请求 。
vhost-mdev的主要功能:
.把自己注册成一个新类型的mdev驱动
.对外提供和vhost-net兼容的ioctl接口 , 用户空间的VFIO驱动可以传递virtio的命令
. 翻译好的virtio命令以virtio mdev API的形式通过mdev bus传递给virtio-mdev设备 。
.当一个新的mdev设备创建时 , kernel总是厂商去加载驱动
.在加载过程中 , vhost-mdev会把virtio mdev设备连接在VFIO的群组 , 因此DMA请求就可以通过VFIO的文件描述符 。
vhost-mdev是连接用户空间驱动(这里是VFIO)和virtio-mdev设备的关键 。它为用户空间驱动提供两个文件描述符:vhost-mdev FD:从用户空间接受vhost的控制命令VFIO container FD:用户空间驱动用来设置DMA
Virtio-mdev 驱动可以把自己注册成一个新的mdev设备 , 暴露一个基于mdev的传输接口给vitio驱动 。它作为kernel的virtio驱动和virtio mdev设备的桥梁 。因为virtio支持的其他类型传输方式 , 因此它可以无缝地和virtio-net驱动对接 。
virtio-mdev设备本质就是一个mdev设备 , 它可以使用virtio-mdev驱动 , 也可以使用vhost-mdev驱动 , vDPA主要关注vhost-mdev流程 。
如果从mdev-bus的角度看virtio-mdev , 它就是一个设备 , 因为它实现了mdev设备的API 。
如果从PCIE BUs的角度看virtio-mdev , 它就是一个驱动 , 因为它主要作用就是发生命令到真正的硬件去 。
【】SRIOV:智能网卡就靠它了!
文章图片

文章图片

注意 , 在本图中 , virtio-mdev驱动和virtio-mdev驱动在这里主要表示virtio mdev设备统一的mdev 的API , 但是他们并不是vDPA kernel流程的一部分 。
vDPA kernel based 实现
我们需要引入一个新的模块vhost-vfio来理解vDPA的kernel实现流程 。


推荐阅读