将网卡绑定到官方驱动进行测试

将网卡绑定到官方驱动进行测试

对于网卡的一些异常情况,常常需要使用官方驱动进行相同的测试以确认问题。
本文叙述了将网卡绑定到官方驱动进行测试的过程。

网卡解绑定

1. lsof /dev/uio* 找到使用 /dev/uioX 设备文件的产品程序。

Develop> lsof /dev/uio*
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
cfe     21178 root   30u   CHR  248,1      0t0 28807 /dev/uio1
cfe     21178 root   32u   CHR  248,0      0t0 28805 /dev/uio0
cfe     21178 root   34u   CHR  248,3      0t0 25875 /dev/uio3
........

从上面的输出里面可以确认,产品的 server 为 cfe 程序,这个 cfe 程序使用了
设备文件 /dev/uioX。

我们首先需要 kill 产品的 server ,确保在没人使用的情况下解绑定网卡。为了防止
kill 程序后守护程序将 server 重新拉起来,可以将 server 重命名,然后 kill server。

示例如下:

Develop> mv /usr/local/bin/cfe-bak /usr/local/bin/cfe
Develop> killall cfe

2. 网卡从 igb_uio 驱动解绑

首先需要确定需要解绑定网卡的 pci 号。一般可以通过 lspci 命令来查询。

某设备上 X710 网卡的 pci 号相关信息示例如下:

Develop> lspci |grep 'Eth'
0f:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE backplane (rev 02)
0f:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE backplane (rev 02)

上面 0f:00.0 与 0f:00.1 就是 X710 网卡的 pci 号。

解绑定需要使用 dpdk_nic_bind.py 脚本来完成,不同的产品这个脚本的位置可能不同,这点需要注意。

解绑定示例如下:

Develop> /usr/local/bin/dpdk_nic_bind.py -u 0f:00.0 0f:00.1

在上面的命令行中,-u 表示解除绑定,0f:00.0 与 0f:00.1 表示要解除绑定的网口。执行完成后,可以执行

dpdk_nic_bind.py -s 命令查看绑定信息,确认是否成功解绑。

示例如下:

Develop> /usr/local/bin/dpdk_nic_bind.py -s
............
Other network devices
=====================
0000:0f:00.0 'Ethernet Controller X710 for 10GbE backplane' unused=igb_uio,uio_pci_generic
0000:0f:00.1 'Ethernet Controller X710 for 10GbE backplane' unused=igb_uio,uio_pci_generic

从上面的输出中可以看到,0000:0f:00.0 与 0000:0f:00.1 网卡接口已经解除了绑定,没有绑定到
任何驱动上面。

加载网卡的官方驱动 ko 时自动识别并绑定

当我们将网卡从 igb_uio 驱动上面解绑之后,就可以加载网卡使用的官方驱动了。这里的官方驱动
一般系统上会带有(一般放在 /bin 目录下),没有的话就需要自己编译后上传到设备上来加载了。

上面的示例操作中,网卡已经解除 igb_uio 的绑定。这样当我们在加载官方驱动的时候,内核会自
动识别到网卡,并执行对应的 probe 操作。

X710 网卡使用的官方驱动是 intel 的 i40e 驱动,加载 i40e 驱动的示例如下:

Develop> insmod /bin/i40e.ko 
Develop> dmesg | tail -n 20
[79357.260739] i40e: Intel(R) Ethernet Connection XL710 Network Driver - version 1.4.25-k
[79357.260746] i40e: Copyright (c) 2013 - 2014 Intel Corporation.
[79357.279249] i40e 0000:0f:00.0: fw 6.1.49420 api 1.7 nvm 6.80 0x80003cf0 0.0.0
[79357.279258] i40e 0000:0f:00.0: The driver for the device detected a newer version of the NVM image than expected. Please install the most recent version of the network driver.
[79357.365299] i40e 0000:0f:00.0: MAC address: 98:30:00:1e:42:20
[79357.369576] i40e 0000:0f:00.0: SAN MAC: 00:00:00:00:02:00
[79357.432223] i40e 0000:0f:00.0 enp15s0f0: renamed from eth2
[79357.496835] i40e 0000:0f:00.0: PCI-Express: Speed 8.0GT/s Width x8
[79357.502928] i40e 0000:0f:00.0: Features: PF-id[0] VFs: 64 VSIs: 66 QP: 16 RX: 1BUF RSS FD_ATR FD_SB NTUPLE VxLAN PTP VEPA
[79357.522602] i40e 0000:0f:00.1: fw 6.1.49420 api 1.7 nvm 6.80 0x80003cf0 0.0.0
[79357.522611] i40e 0000:0f:00.1: The driver for the device detected a newer version of the NVM image than expected. Please install the most recent version of the network driver.
[79357.610493] i40e 0000:0f:00.1: MAC address: 98:30:00:1e:42:21
[79357.614555] i40e 0000:0f:00.1: SAN MAC: 00:00:00:00:02:01
[79357.842767] i40e 0000:0f:00.1: PCI-Express: Speed 8.0GT/s Width x8
[79357.849279] i40e 0000:0f:00.1: Features: PF-id[1] VFs: 64 VSIs: 66 QP: 16 RX: 1BUF RSS FD_ATR FD_SB NTUPLE VxLAN PTP VEPA
[79357.966780] i40e 0000:0f:00.1 enp15s0f1: renamed from eth2

从上面的输出中可以看到,加载了 i40e.ko 后,0f:00.0 与 0f:00.1 网卡接口被自动识别并绑定到
了 i40e 驱动,对应的 netdev 名称分别为:enp15s0f0 与 enp15s0f1,这之后我们就可以进行测试
了。

手动绑定网卡到官方驱动上

如果我们先加载了网卡的官方驱动,然后再解除 igb_uio 的绑定并重新绑定到官方驱动上面,可以
执行下面的命令手动将网卡接口绑定到官方驱动上。

dpdk_nic_bind.py -b driver_name pcinum

driver_name 为加载的官方驱动的名称,pcinum 为产品的 pci 号,多个 pcinum 之间使用空格分隔。

一个示例如下:

Develop> /usr/local/bin/dpdk_nic_bind.py -b i40e 0f:00.0 0f:00.1
Develop> /usr/local/bin/dpdk_nic_bind.py -s
········
Network devices using kernel driver
===================================
0000:0f:00.0 'Ethernet Controller X710 for 10GbE backplane' if=enp15s0f0 drv=i40e unused=igb_uio,uio_pci_generic 
0000:0f:00.1 'Ethernet Controller X710 for 10GbE backplane' if=enp15s0f1 drv=i40e unused=igb_uio,uio_pci_generic 

上面的示例中首先通过 dpdk_nic_bind.py -b 将 0f:00.0 与 0f:00.1 绑定到 i40e 官方驱动上,然后
执行 dpdk_nic_bind.py -s 显示当前的网卡设备状态。从输出可以发现,0f:00.0 与 0f:00.1 已经被
绑定到了官方驱动上面。

重新绑定到 igb_uio 中并恢复重命名的产品 server

测试完成后,我们需要重新将网卡绑定到 igb_uio 上,执行 dpdk_nic_bind.py -b 命令来完成。

如果绑定的过程中有如下报警,则需要执行 ifconfig netdev down 命令来将网卡 down 掉,再解除
绑定。

Develop> /usr/local/bin/dpdk_nic_bind.py -b igb_uio 0f:00.0 0f:00.1
Routing table indicates that interface 0000:0f:00.0 is active. Not modifying

ifconfig down 掉网卡后再重新绑定的示例:

Develop> ifconfig enp15s0f0 down
Develop> /usr/local/bin/dpdk_nic_bind.py -b igb_uio 0f:00.0

将重命名的 server 恢复。示例如下:

Develop> mv /usr/local/bin/cfe-bak  /usr/local/bin/cfe
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章