DPDK:释放 MBUF 时出现编译错误

DPDK: compilation error while freeing MBUF

我正在尝试从分配的池中创建一个简单的 MBUF 并释放 MBUF,但是 运行 出现以下编译问题。如果我注释掉 mbuf_free,程序编译正常。 . 有什么指点吗?

代码:

        m = rte_pktmbuf_alloc(pktmbuf_pool);
        if (m == NULL)
            printf("Cannot allocate mbuf");
        if (rte_pktmbuf_pkt_len(m) != 0)
            printf("Bad length");

        data = rte_pktmbuf_append(m, packet_len);
        if (data == NULL)
            printf("Cannot append data");
       
        ....

        rte_pktmbuf_free(packet_data_mbuf); <<<<< COMPLAINS here
 

错误:

/usr/local/include/dpdk/rte_memcpy.h: In function ‘__rte_pktmbuf_free_direct’:
/usr/local/include/dpdk/rte_memcpy.h:595:64: error: ‘__builtin_ia32_palignr128’ needs isa option -m32 -mssse3
         _mm_storeu_si128((__m128i *)((uint8_t *)dst + 0 * 16), _mm_alignr_epi8(xmm1, xmm0, offset));        \
                                                                ^
/usr/local/include/dpdk/rte_memcpy.h:644:16: note: in expansion of macro ‘MOVEUNALIGNED_LEFT47_IMM’
     case 0x01: MOVEUNALIGNED_LEFT47_IMM(dst, src, n, 0x01); break;    \
                ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/dpdk/rte_memcpy.h:798:2: note: in expansion of macro ‘MOVEUNALIGNED_LEFT47’
  MOVEUNALIGNED_LEFT47(dst, src, n, srcofs);
  ^~~~~~~~~~~~~~~~~~~~
......
......

DPDK API __rte_pktmbuf_free_direct 使用 SIMD 内在函数 _mm_alignr_epi8。这在内部依赖于 palignr ,它们是 SSSE3 指令集的一部分。

根据编译器消息 error: ‘__builtin_ia32_palignr128’ needs ISA option -m32 -mssse3-mssse3 的编译器标志似乎在构建期间未传递。

解决方案:使用 x86 平台的 -mssse3 最低 DPDK 要求更新 CFLAGS。

注意:如果 dpdk 版本大于 19.08,对于自定义安装或发行版发布的 libdpdk,设置正确标志的简单方法是设置 CFGLAGS+=$(pkg-config --cflags libdpdk)