从DPDK 17.11迁移至19.11时创建mbuf池遇Invalid argument错误求助
DPDK 17.11迁移至19.11:mbuf池创建返回无效参数问题排查
问题描述
将代码从DPDK 17.11版本迁移至19.11版本时,调用rte_pktmbuf_pool_create创建mbuf内存池返回Invalid argument错误,对应错误码为EINVAL(无效参数)。
代码片段:
struct rte_mempool *pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NB_MBUF, MEMPOOL_CACHE_SZ, 0, MBUF_DATA_SZ, rte_socket_id());
环境信息
- 平台:x86_64
- 库模式:shared
- 错误原因:EINVAL(无效参数)
可能的原因及解决方法
1. 数据区大小MBUF_DATA_SZ不满足最小要求
DPDK 19.11对data_room_size(即代码中的MBUF_DATA_SZ)有明确要求:必须大于等于RTE_PKTMBUF_HEADROOM(默认128字节)。如果MBUF_DATA_SZ小于该值,会直接返回无效参数错误。
- 解决:确保
MBUF_DATA_SZ的定义满足MBUF_DATA_SZ >= RTE_PKTMBUF_HEADROOM,推荐直接使用DPDK标准定义的RTE_MBUF_DEFAULT_BUF_SIZE(默认包含头部预留空间,值为2048+128)作为参数。
2. 内存池缓存大小MEMPOOL_CACHE_SZ超限
DPDK 19.11限制内存池每个核心的缓存大小不能超过RTE_MEMPOOL_CACHE_MAX_SIZE(默认值为512)。如果MEMPOOL_CACHE_SZ设置大于该值,会触发无效参数错误。
- 解决:将
MEMPOOL_CACHE_SZ调整为不超过RTE_MEMPOOL_CACHE_MAX_SIZE的合理值,例如128或256。
3. mbuf数量NB_MBUF非法
如果NB_MBUF设置为0,或者数值过大超出系统可用内存承载范围,会返回无效参数错误。
- 解决:确保
NB_MBUF为正整数,且大小符合当前系统的内存容量。
4. 参数类型不匹配
DPDK 19.11对参数类型的检查更严格,若NB_MBUF、MEMPOOL_CACHE_SZ等参数为有符号整数类型(如int),可能因隐式转换为负数导致参数无效。
- 解决:将相关参数的类型定义为
unsigned int,匹配rte_pktmbuf_pool_create的函数签名要求。
修改示例代码
// 采用DPDK标准参数定义,避免兼容性问题 #define NB_MBUF 4096 #define MEMPOOL_CACHE_SZ 256 struct rte_mempool *pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NB_MBUF, MEMPOOL_CACHE_SZ, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
内容的提问来源于stack exchange,提问作者Amit Limaye
相关产品推荐
相关产品推荐

