最近,我正在为NIC开发vDPA驱动程序。在用多VFs对virtio进行测试时,发现内核vDPA框架为多个VFs分配相同的DMA地址,不同的VF操作相同的DMA地址,如更新使用的索引,导致内核病毒队列工作异常。
这些步骤如下:
*[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**[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*。
*[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选项。
[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工作得很好。
发布于 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
我们期待着未来的内核版本将支持这一特性。
https://stackoverflow.com/questions/74516686
复制相似问题