首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在主机上应用具有virtio的多VFs?

如何在主机上应用具有virtio的多VFs?
EN

Stack Overflow用户
提问于 2022-11-21 09:24:34
回答 1查看 13关注 0票数 0

最近,我正在为NIC开发vDPA驱动程序。在用多VFs对virtio进行测试时,发现内核vDPA框架为多个VFs分配相同的DMA地址,不同的VF操作相同的DMA地址,如更新使用的索引,导致内核病毒队列工作异常。

这些步骤如下:

  1. 启用了NIC sriov,创建了4个VFs,我们可以看到4个vdpa管理设备是成功创建的。

代码语言:javascript
复制
*[root@localhost ~]# echo 4 > /sys/class/net/enp1s0np0/device/sriov_numvfs
[root@localhost ~]# vdpa mgmtdev show
pci/0000:01:08.0:
supported_classes net
pci/0000:01:08.1:
supported_classes net
pci/0000:01:08.2:
supported_classes net
pci/0000:01:08.3:
supported_classes net*

  1. 添加vdpa设备并启用virtio模块。创建4个vdpa设备,驱动程序绑定成功。

代码语言:javascript
复制
*[root@localhost ~]# vdpa dev add mgmtdev pci/0000:01:08.0 name vdpa0
[root@localhost ~]# vdpa dev add mgmtdev pci/0000:01:08.1 name vdpa1
[root@localhost ~]# vdpa dev add mgmtdev pci/0000:01:08.2 name vdpa2
[root@localhost ~]# vdpa dev add mgmtdev pci/0000:01:08.3 name vdpa3
[root@localhost ~]# modprobe virtio_vdpa
[root@localhost ~]# ls -l /sys/bus/vdpa/drivers/virtio_vdpa/
total 0
--w-------. 1 root root 4096 Nov 21 16:55 bind
lrwxrwxrwx. 1 root root    0 Nov 21 16:55 module -> ../../../../module/virtio_vdpa
--w-------. 1 root root 4096 Nov 21 16:55 uevent
--w-------. 1 root root 4096 Nov 21 16:55 unbind
lrwxrwxrwx. 1 root root    0 Nov 21 16:55 vdpa0 -> ../../../../devices/pci0000:00/0000:00:01.0/0000:01:08.0/vdpa0
lrwxrwxrwx. 1 root root    0 Nov 21 16:55 vdpa1 -> ../../../../devices/pci0000:00/0000:00:01.0/0000:01:08.1/vdpa1
lrwxrwxrwx. 1 root root    0 Nov 21 16:55 vdpa2 -> ../../../../devices/pci0000:00/0000:00:01.0/0000:01:08.2/vdpa2
lrwxrwxrwx. 1 root root    0 Nov 21 16:55 vdpa3 -> ../../../../devices/pci0000:00/0000:00:01.0/0000:01:08.3/vdpa3*

  1. 检查内核消息输出,我们可以看到virtio设备和dma地址.

代码语言:javascript
复制
*[Mon Nov 21 16:55:42 2022] virtio_net virtio0: devname virtio0 name input.0 index 0 dmaaddr ffffc000
[Mon Nov 21 16:55:42 2022] virtio_net virtio0: devname virtio0 name output.0 index 1 dmaaddr ffff8000
[Mon Nov 21 16:55:42 2022] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[Mon Nov 21 16:55:42 2022] virtio_net virtio1: devname virtio1 name input.0 index 0 dmaaddr ffffc000
[Mon Nov 21 16:55:42 2022] virtio_net virtio1: devname virtio1 name output.0 index 1 dmaaddr ffff8000
[Mon Nov 21 16:55:42 2022] IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready
[Mon Nov 21 16:55:42 2022] virtio_net virtio2: devname virtio2 name input.0 index 0 dmaaddr ffffc000
[Mon Nov 21 16:55:42 2022] virtio_net virtio2: devname virtio2 name output.0 index 1 dmaaddr ffff8000
[Mon Nov 21 16:55:42 2022] IPv6: ADDRCONF(NETDEV_CHANGE): eth2: link becomes ready
[Mon Nov 21 16:55:42 2022] virtio_net virtio0 enp1s0v0: renamed from eth5
[Mon Nov 21 16:55:42 2022] virtio_net virtio3: devname virtio3 name input.0 index 0 dmaaddr ffffc000
[Mon Nov 21 16:55:42 2022] virtio_net virtio3: devname virtio3 name output.0 index 1 dmaaddr ffff8000
[Mon Nov 21 16:55:42 2022] virtio_net virtio1 enp1s0v1: renamed from eth6
[Mon Nov 21 16:55:42 2022] virtio_net virtio2 enp1s0v2: renamed from eth7
[Mon Nov 21 16:55:42 2022] IPv6: ADDRCONF(NETDEV_CHANGE): eth4: link becomes ready
[Mon Nov 21 16:55:42 2022] virtio_net virtio3 enp1s0v3: renamed from eth5*

内核vDPA框架似乎将相同的virtqueue dma地址分配给四个不同的vf。此应用程序场景引用vDPA对Red:https://www.redhat.com/en/blog/vdpa-kernel-framework-part-3-usage-vms-and-containers的描述

我的内核版本为5.15.15,在编译内核时都启用了内核vDPA选项。

代码语言:javascript
复制
[root@localhost linux-5.15.15]# cat .config | grep VDPA
`CONFIG_VIRTIO_VDPA=m
CONFIG_VDPA=y
CONFIG_VDPA_SIM=m
CONFIG_VDPA_SIM_NET=m
CONFIG_VDPA_SIM_BLOCK=m
#CONFIG_VDPA_USER is not set
CONFIG_MLX5_VDPA=y
CONFIG_MLX5_VDPA_NET=m
CONFIG_VP_VDPA=m
CONFIG_VHOST_VDPA=m`
[root@localhost linux-5.15.15]#

那么,对于内核vDPA框架,如果有人能给出一些建议,这会有很大的帮助吗?非常感谢。

我用vhost-vdpa进行了测试,用QEMU启动了VM,并且多个VFs工作得很好。

EN

回答 1

Stack Overflow用户

发布于 2022-11-21 10:52:11

我研究了virtio规范,发现virtio1.1规范已经更新并添加了一个新的特性位VIRTIO_F_SR_IOV。我想内核vDPA框架中会有一些适应来支持多个vf。但是目前我还没有看到5.19内核中的实现。然而,这证实了内核框架还不受支持。

对VIRTIO_F_SR_IOV的要求如下(见virtio1.1规范,第6.1/6.2章):

如果已经协商了VIRTIO_F_SR_IOV,驱动程序可以通过设备的PCI功能结构启用虚拟功能。如果设备没有PCI功能结构或不是PCI设备,则驱动程序不能协商VIRTIO_F_SR_IOV。驱动程序必须协商VIRTIO_F_SR_IOV并完成特性协商(包括检查FEATURES_OK设备状态位),然后才能通过设备的PCI功能结构启用虚拟功能。在成功协商VIRTIO_F_SR_IOV之后,即使设备或系统已经完全或部分复位,驱动程序也可以通过设备的PCI功能结构启用虚拟功能,甚至在复位后无需重新协商VIRTIO_F_SR_IOV。

如果设备是PCI设备,并且呈现PCI SR-IOV功能结构,则该设备应该提供VIRTIO_F_SR_IOV,否则它就不能提供VIRTIO_F_SR_IOV。

见改动:

https://www.oasis-open.org/committees/ballot.php?id=3218

https://github.com/oasis-tcs/virtio-spec/issues/11

我们期待着未来的内核版本将支持这一特性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74516686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档