如何解决Mellanox Bluefield 2巨帧测试中Scatter offload未配置错误?
解决DPDK 20.11.1下Mellanox BlueField 2巨帧测试的Scatter Offload配置错误
问题原因
Mellanox BlueField 2的mlx5 DPDK驱动在启用巨帧(Jumbo Frame)时,强制要求同时启用Scatter RX Offload。巨帧长度超过常规MTU后,硬件会将其拆分为多个接收段,Scatter Offload用于让驱动正确处理这些分散的数据包段,未配置该offload会导致队列初始化失败。
解决方案
需要在网卡配置的RX offloads中添加DEV_RX_OFFLOAD_SCATTER标志,具体修改如下:
1. 修改默认端口配置
在初始的port_conf结构中,直接为RX offloads添加Scatter支持:
static struct rte_eth_conf port_conf = { .rxmode = { .mq_mode = ETH_MQ_RX_RSS, .max_rx_pkt_len = 9000, .split_hdr_size = 0, // 添加DEV_RX_OFFLOAD_SCATTER到默认RX offloads .offloads = DEV_RX_OFFLOAD_CHECKSUM | DEV_RX_OFFLOAD_SCATTER, }, .rx_adv_conf = { .rss_conf = { .rss_key = NULL, .rss_hf = ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP | ETH_RSS_SCTP, }, }, .txmode = { .mq_mode = ETH_MQ_TX_NONE, .offloads = (DEV_TX_OFFLOAD_CHECKSUM|DEV_TX_OFFLOAD_MULTI_SEGS), }, };
2. 或在启用巨帧的分支中添加
如果希望仅在启用巨帧时才开启Scatter Offload,也可以在--enable-jumbo的处理逻辑中添加:
printf("jumbo frame is enabled\n"); // 添加Scatter RX offload port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME | DEV_RX_OFFLOAD_SCATTER; port_conf.txmode.offloads |= DEV_TX_OFFLOAD_MULTI_SEGS;
3. 验证其他配置
- 确保
max_rx_pkt_len设置的值(如8000)不超过硬件支持的最大巨帧长度,BlueField 2通常支持最大9000字节的巨帧。 - 确认TX侧的
DEV_TX_OFFLOAD_MULTI_SEGS已配置(你的代码中已经添加,无需修改),该offload用于支持巨帧的分段发送。
验证修改
重新编译l3fwd-acl后,使用原命令启动:
./l3fwd-acl -l 1,2 -n 4 -- -p 0x3 --config="(0,0,1),(1,0,2)" --rule_ipv4="/root/rule_ipv4.db" --rule_ipv6="/root/rule_ipv6.db" --eth-dest=0,01:00:00:00:00:00 --enable-jumbo --max-pkt-len=8000
此时RX队列初始化不会再出现Scatter offload未配置的错误。
内容的提问来源于stack exchange,提问作者ima
相关产品推荐
相关产品推荐

