DPDK19.11下i40e XL710发包失败:TX描述符219未完成求助
解决DPDK 19.11 + XL710网卡发送失败(TX descriptor未完成)问题
针对你遇到的TX descriptor 219 is not done(port=0 queue=0)报错,结合DPDK 19.11和XL710网卡的特性,可从以下几个方向排查解决:
1. 检查TX描述符环的配置合法性
XL710的i40e驱动对TX描述符环大小有严格要求:
- 环大小必须是2的幂次,且范围在128~4096之间(DPDK 19.11版本限制)
- 若当前配置的环大小过小(比如默认256),高负载下容易出现描述符耗尽未回收的情况
- 建议在初始化时将TX队列环大小设置为1024或2048,示例代码:
int ret = rte_eth_tx_queue_setup(port_id, 0, 1024, rte_eth_dev_socket_id(port_id), NULL); if (ret != 0) { rte_exit(EXIT_FAILURE, "Failed to setup TX queue\n"); }
2. 验证TSO卸载的参数正确性
启用TSO时,Mbuf的参数配置错误是常见触发点:
- 必须确保Mbuf的
ol_flags包含PKT_TX_TCP_SEG标志 tso_segsz需设置为合法值(如1460,对应MTU 1500的TCP分段大小)- 需保证IP头、TCP头格式正确,且数据包总长度大于
tso_segsz - 可添加调试代码校验参数:
struct rte_mbuf *mbuf = ...; // 待发送的Mbuf if (mbuf->ol_flags & PKT_TX_TCP_SEG) { if (mbuf->tso_segsz < 536 || mbuf->tso_segsz > 65535) { printf("Invalid TSO segment size: %u\n", mbuf->tso_segsz); } }
3. 升级网卡固件版本
当前使用的固件版本6.80存在已知的TSO和描述符处理兼容性问题,建议升级到Intel官方推荐的DPDK 19.11适配版本(如7.10及以上),旧固件可能导致硬件无法正确完成TX描述符的回收。
4. 排查VFIO-PCI驱动的环境配置
- 确认系统已启用IOMMU,启动参数需添加
intel_iommu=on iommu=pt - 检查网卡是否被DPDK独占,无其他驱动(如i40e内核驱动)占用资源,可通过
dpdk-devbind.py --status确认绑定状态
5. 优化TX发送逻辑
- 避免单次调用
rte_eth_tx_burst发送过多数据包,建议每次发送量不超过TX队列可用描述符的70% - 发送前可调用
rte_eth_tx_queue_count获取可用描述符数量,动态调整发送批量:uint16_t avail = rte_eth_tx_queue_count(port_id, 0); uint16_t send_num = RTE_MIN(avail * 7 / 10, num_pkts); uint16_t sent = rte_eth_tx_burst(port_id, 0, pkts, send_num);
6. 确认rte_eth_tx_prepare的处理完整性
虽然函数返回正常,但需校验其实际处理的数据包数量是否与待发送数量一致:
uint16_t prepared = rte_eth_tx_prepare(port_id, 0, pkts, num_pkts); if (prepared != num_pkts) { printf("TX prepare failed for %u packets\n", num_pkts - prepared); }
若存在未被正确处理的数据包,需检查Mbuf的合法性(如是否为DPDK分配的Mbuf、数据区是否越界)。
内容的提问来源于stack exchange,提问作者J.Heng
相关产品推荐
相关产品推荐

