[DPDK] rte_eth_dev_start()出现段错误

发布时间 2023-06-15 11:17:03作者: CQzhangyu

[DPDK] rte_eth_dev_start()出现段错误

一天我运行DPDK时,它在rte_eth_dev_start()时发生段错误。

Thread 1 "my_dpdk" received signal SIGSEGV, Segmentation fault.
0x00007ffff76aaff7 in execute_ioctl () from /lib/x86_64-linux-gnu/libibverbs.so.1
(gdb) bt
#0  0x00007ffff76aaff7 in execute_ioctl () from /lib/x86_64-linux-gnu/libibverbs.so.1
#1  0x00007ffff7718b7d in mlx5dv_devx_obj_query () from /lib/x86_64-linux-gnu/libmlx5.so.1
#2  0x00007ffff7fbf9cb in mlx5_devx_cmd_queue_counter_query ()
   from /usr/local/lib/x86_64-linux-gnu/dpdk/pmds-21.0/librte_common_mlx5.so.21.0
#3  0x00007ffff6c5f966 in mlx5_os_read_dev_stat ()
   from /usr/local/lib/x86_64-linux-gnu/dpdk/pmds-21.0/librte_net_mlx5.so.21.0
#4  0x00007ffff6c62280 in mlx5_os_read_dev_counters ()
   from /usr/local/lib/x86_64-linux-gnu/dpdk/pmds-21.0/librte_net_mlx5.so.21.0
#5  0x00007ffff6c626ba in mlx5_os_stats_init ()
   from /usr/local/lib/x86_64-linux-gnu/dpdk/pmds-21.0/librte_net_mlx5.so.21.0
#6  0x00007ffff6b7527d in mlx5_dev_start ()
   from /usr/local/lib/x86_64-linux-gnu/dpdk/pmds-21.0/librte_net_mlx5.so.21.0
#7  0x00007ffff7f1642e in rte_eth_dev_start ()
   from /usr/local/lib/x86_64-linux-gnu/librte_ethdev.so.21
#8  0x00005555555da776 in port_init () at /path/to/my-dpdk.c:201
#9  0x00005555555dada0 in main (argc=9, argv=0x7fffffffe4a8)
    at /path/to/my-dpdk.c:318

不仅是当前程序出错,该机器上的所有DPDK程序在进行到rte_eth_dev_start()时都会出现同样的错误。这令人很迷惑。其一,DPDK如果出错,一般会返回详细的错误信息和错误代码,而不是直接段错误让程序崩溃。这意味着这不是我写的程序出了错,而是DPDK内部的问题。其二,它最终报错的点libibverbs.so.1是比DPDK更内层的库(可以理解为DPDK是在这个库的基础上编译的)。这说明可能是DPDK与这个内层的库兼容上出了问题。要么是DPDK的问题,要么是这个libibverrbs.so.1的问题。后者属于网卡驱动的一部分。

尝试

  • 依次重装MLNX_OFED,dpdk,均无效。
  • 将该机器的配置与另一台正常的机器做对比,发现配置相同,所以不是配置的问题。
  • 该机器的mellanox firmware与正常的机器相同,所以也不是firmware的问题。
  • 怀疑是meson版本的问题,后来证明也不是meson的问题。

解决

  • 该机器的DPDK版本是20.11.3,另一台好机器上的版本是20.11.7。于是将该机器的DPDK版本也换为20.11.7,再编译DPDK,问题解决。

结论

我后来又在另一台机器上也出现了类似的问题:在rte_eth_dev_start()报错,但最终停在的位置不是libibverbs.so.1,而是libmlx5.so。也是用了同样的方法解决。

最终还是不知道是什么原因导致了这个问题。以后乖乖用20.11.7就好了。