將網卡綁定到官方驅動進行測試
對於網卡的一些異常情況,常常需要使用官方驅動進行相同的測試以確認問題。
本文敘述了將網卡綁定到官方驅動進行測試的過程。
網卡解綁定
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