將網卡綁定到官方驅動進行測試

將網卡綁定到官方驅動進行測試

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

網卡解綁定

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章