参考文档
https://community.mellanox.com/s/article/howto-configure-sr-iov-for-connect-ib-connectx-4-with-kvm--infiniband-x
1. 检查主机启动指令中是否开启了Intel_IOMMU
[root@g1 ~]# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.10.0-862.el7.x86_64 root=UUID=6d337e51-2963-406e-9580-04dbca0f8d94 ro nouveau.modeset=0 rd.driver.blacklist=nouveau rhgb quiet net.ifnames=0 biosdevname=1 intel_iommu=on iommu=pt pci=realloc
里面intel_iommu=on iommu=pt都是on的状态,说明已经开启了
2. 检查opensm已经开启了虚拟化支持
opensm -c /tmp/opensm.conf && grep virt_enabled /tmp/opensm.conf && rm -f /tmp/opensm.conf
virt_enabled 2
看到virt_enabled 2,说明已经开启了
3. 在硬件Firmware中使能ConnectX-6 SRIOV,配置VF数量NUM_OF_VFS
找到ConnectX-6硬件的MST(Mellanox Software Tools)编号,在下面输出里,对应的是/dev/mst/mt4123_pciconf0
[root@g1 device]# mst status -v
DEVICE_TYPE MST PCI RDMA NET NUMA
ConnectX6(rev:0) /dev/mst/mt4123_pciconf0 04:00.0 mlx5_1 net-ib0 0
检查SRIOV配置,看到还没有使能
[root@g1 ~]# mlxconfig -d /dev/mst/mt4123_pciconf0 query | grep -e SRIOV_EN -e NUM_OF_VFS -e FPP_EN
NUM_OF_VFS 0
SRIOV_EN False(0)
配置EN和NUM
[root@g1 ~]# mlxconfig -d /dev/mst/mt4123_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4
在ConnectX-6以前,这里重启PCI设备就可以生效了
[root@g1 ~]# mlxfwreset -y -d /dev/mst/mt4123_pciconf0 reset
但是在当前19.3.24,对于ConnectX-6 HCA,需要重启服务器才能进行后面的步骤
重新开机后检查配置
[root@g1 ~]# mlxconfig -d /dev/mst/mt4123_pciconf0 query | grep -e SRIOV_EN -e NUM_OF_VFS -e FPP_EN
NUM_OF_VFS 4
SRIOV_EN True(1)
4. 在MLNX-OFED驱动中使能配置VF数量mlx5_num_vfs
检查、配置vf数量,因为还没配置,所以是0
[root@g1 ~]# cat /sys/class/infiniband/mlx5_1/device/mlx5_num_vfs
0
这里我测试把OFED驱动中的vf数量配置成1
echo 1> /sys/class/infiniband/mlx5_1/device/mlx5_num_vfs
在PCI总线上,用lspci可以看到ConnectX-6对应的设备出现了多次,其中Function 1是刚才配置好的Virtual Function
[root@g1 ~]# lspci|grep Mellanox
04:00.0 Infiniband controller: Mellanox Technologies MT28908 Family [ConnectX-6]
04:00.1 Infiniband controller: Mellanox Technologies MT28908 Family [ConnectX-6 Virtual Function]
在ibdev2netdev输出中也可以看到,和04:00.1这个Virtual Function,对应的ib2和mlnx5_4设备
[root@g1 ~]# ibdev2netdev -v
0000:04:00.1 mlx5_4 (MT4124 - NA) fw 20.99.5802 port 1 (DOWN ) ==> ib2 (Down)
ibstat检查这个Virtual Function,看到这个设备还没有Node GUID和Port GUID
[root@g1 ~]# ibstat -d mlx5_4 | grep GUID
Node GUID: 0x0000000000000000
System image GUID: 0x98039b030082bc4e
Port GUID: 0x0000000000000000
为VF配置GUID。这里我把Physical Function的GUID加1,作为第一个Virtual Fucntion的GUID。
[root@g1 ~]# echo Follow > /sys/class/infiniband/mlx5_1/device/sriov/0/policy
[root@g1 ~]# echo 98:03:9b:03:00:82:bc:4f > /sys/class/infiniband/mlx5_1/device/sriov/0/node
[root@g1 ~]# echo 98:03:9b:03:00:82:bc:4f > /sys/class/infiniband/mlx5_1/device/sriov/0/port
重新绑定PCI Function到MLNX OFED驱动,让上面的配置生效。
[root@g1 ~]# echo 0000:04:00.1 > /sys/bus/pci/drivers/mlx5_core/unbind
[root@g1 ~]# echo 0000:04:00.1 > /sys/bus/pci/drivers/mlx5_core/bind
5. 开virt-manager图形界面,把VF直通到虚拟机上
之后virt-dumpxml可以看到xml格式的配置方式。