问题描述:DPDK网卡I350加载igb_uio或者vfio驱动执行接收描述符初始化过程中造成系统重
执行步骤:
1. 编译完成DPDK,加载igb_uio驱动,绑定一个I350网卡。设置两个node的2M大页数量分别为1024。
2. 编译示例应用flow_filtering,屏蔽相关flow过滤函数,只保留网卡数据包回调接收部分。
3. 执行编译好的flow程序,控制台无响应,系统直接重启。
问题分析:
编译DPDK 18.11.2或19.02版本加载igb_uio驱动过程,在调用eth_igb_rx_init(网卡接收初始化)函数中直接造成系统重启。通过调试发现执行到这行E1000_WRITE_REG(hw, E1000_RDT(rxq->reg_idx), rxq->nb_rx_desc - 1),往寄存器写RDT时出的问题。
如果修改代码为E1000_WRITE_REG(hw, E1000_RDT(rxq->reg_idx), 0),初始化时系统就不会重启。但是网卡不会接收到任何数据包。前提是已经确认了在内核自带igb驱动下网卡是有镜像的数据包。进一步查询,未接收到数据包的原因是执行到staterr = rxdp->wb.upper.status_error时,该staterr为0,就跳出数据包的回调函数,正常接收到数据包此状态位不应该为0。
寻求原因及解决方法:
DPDK中对网卡I350使用igb_uio或者vfio驱动后执行到初始化RDT设置时为什么会出现该问题,如何解决?没有头绪,已经搞了好几天了。
运行环境:
操作系统:CentOS Linux release 7.5.1804 (Core)
内存: 128G
CPU: 40核
内核版本: 3.10.0-862.el7.x86_64
网卡:Intel Corporation I350 Gigabit Network Connection