dpdk 中的 ethtool 工具相關問題

ethtool 是 dpdk 中提供的一個工具,能夠 dump 網卡的寄存器,查看其它網卡相關的信息。在 dpdk 程序出現異常時,常常需要使用 ethtool 獲取網卡的一些信息來定位問題。

我最近也嘗試用了用 ethtool,中間卻遇到了很多問題。我使用的 dpdk 版本是 17.05。

第一類是編譯相關的問題,第二類是 ethtool 自身支持網卡的問題。下面我就從這兩方面的問題開始描述。

使用 ethtool 時的 .config 配置

dpdk 的官方文檔中說明,要使用 ethtool 需要使能 KNI_KMOD_ETHTOOL 功能項。這通過修改 .config 配置文件來完成。修改完成之後重新編譯即可,這個問題相對簡單。

執行了 kni 程序之後,通過 ifconfig 可以看到多出了一個網卡,這個網卡就是之後我使用 ethtool 來查看的網卡硬件。

hugepage 內存不足導致 eal 初始化失敗的問題

執行 ifconfig 命令看到多出來的網卡之後,我以爲 ethtool 就能正常工作,結果它在啓動的時候就報了錯,錯誤信息表明 eal 初始化失敗。

具體的報錯信息表明沒有足夠的 hugepage 內存使用。

我猜是因爲 kni 程序將所有的 hugepage 內存全部獨佔造成了這個問題,就修改了 /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages 文件,這之後 eal 初始化這一步沒有報錯,但是又出現了一個新的錯誤,錯誤內容如下:

Cannot create lock on ‘/var/run/.rte_config’. Is another primary process running?

在網上搜索了下這個問題,沒有發現什麼解決方案。

ethtool 不支持當前網卡

這之後我刪除了 rte_kni.ko 這個模塊,dmesg 查看系統信息發現瞭如下內容:

Device not supported by ethtool

這個信息表面上看來是說 ethtool 不支持我的網卡,但是我使用的是 e1000 的網卡呀,我想應該不至於不支持吧。

爲了確認 ethtool 是否支持我的網卡,我使用 cscope 在源碼中搜索 Device not supported by ethtool 這個字符串,發現它是在 kni_misc.c 中的 kni_ioctl_create 函數中打印的。這個函數中會用獲取到的當前網卡信息查詢兩張表——ixgbe_pci_tbl 與 igb_pci_tbl。

這兩張表的內容如下:

const struct pci_device_id ixgbe_pci_tbl[] = {
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_DUAL_PORT)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_SINGLE_PORT)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AT)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AT2)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_CX4_DUAL_PORT)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_DA_DUAL_PORT)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_XF_LR)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_SFP_LOM)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_BX)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_KX4)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_XAUI_LOM)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_KR)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP_EM)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_KX4_MEZZ)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_CX4)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_BACKPLANE_FCOE)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP_FCOE)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_T3_LOM)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_COMBO_BACKPLANE)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_X540T)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP_SF2)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_LS)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599EN_SFP)},
	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_QSFP_SF_QP)},
	/* required last entry */
	{0, }
};

const struct pci_device_id igb_pci_tbl[] = {
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I354_BACKPLANE_1GBPS) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I354_SGMII) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I354_BACKPLANE_2_5GBPS) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_COPPER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_FIBER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_SERDES) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_SGMII) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_COPPER_FLASHLESS) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_SERDES_FLASHLESS) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I211_COPPER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_COPPER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_FIBER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_SERDES) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_SGMII) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_COPPER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_FIBER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_QUAD_FIBER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_SERDES) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_SGMII) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_COPPER_DUAL) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_DH89XXCC_SGMII) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_DH89XXCC_SERDES) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_DH89XXCC_BACKPLANE) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_DH89XXCC_SFP) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82576) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_NS) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_NS_SERDES) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_FIBER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_SERDES) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_SERDES_QUAD) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_QUAD_COPPER_ET2) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_QUAD_COPPER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82575EB_COPPER) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82575EB_FIBER_SERDES) },
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82575GB_QUAD_COPPER) },
	/* required last entry */
	{0, }
};

我使用 lspci 命令查看我的網卡型號,得到的信息如下:

e1000 82545EM

這個型號在 dpdk 中對應的宏是 E1000_DEV_82545EM,並不存在於上面的兩張表中,這表明 ethtool 確實不支持此款網卡。從第二張表中我發現 e1000 網卡是一個系列,其中有很多不同型號的網卡,這是我之前沒有意識到的問題。

此 ethtool 非彼 ethtool

這隻後我發現除了 dpdk 中的 ethtool 工具,linux 中也有一個 ethtool 工具。我應該研究研究 linux 中的 ethtool 工具,我們平時使用的也是它。

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