DPDK 抛出 EAL:eal_memalloc_alloc_seg_bulk():在字符串连接上找不到合适的 memseg_list

DPDK throws EAL: eal_memalloc_alloc_seg_bulk(): couldn't find suitable memseg_list on string concatenate

我有一个 DPDK 环境设置,我的程序的错误部分连接了一个字符串。该字符串可以尽可能长(假设最大字符数为 1,000,000)。 我 运行 我的程序 ./program --lcores='0-4'

我正在使用 DPDK 的 rte_malloc、rte_memcpy、rte_strlcat 和 rte_free 函数。下面是代码片段


int current_length = strlen(fx->var);
int new_length = (datalen + current_length) + 1;

char *temp = (char *)rte_malloc("char *", new_length * (*fx->var), 0);

rte_memcpy(temp, fx->var, current_length);
rte_strlcat(temp, data, datalen);
temp[new_length] = '[=12=]';


fx->var = (char *)rte_malloc("var", new_length * (*fx->var), 0);
rte_memcpy(fx->var, temp, new_length);
fx->var[new_length] = '[=12=]';

rte_free(temp);

我的程序在 EAL 一段时间后退出:eal_memalloc_alloc_seg_bulk(): 找不到合适的 memseg_list。以下是我得到的堆栈跟踪

(gdb) where
#0  0x0000555555564d5b in _mm256_storeu_si256 (__A=..., __P=0x0) at /usr/lib/gcc/x86_64-linux-gnu/9/include/avxintrin.h:928
#1  rte_mov32 (
    src=0x1a80b5a80 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", dst=0x0) at /usr/local/include/rte_memcpy.h:320
#2  rte_mov64 (
    src=0x1a80b5a80 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", dst=0x0) at /usr/local/include/rte_memcpy.h:330
#3  rte_memcpy_aligned (n=88, src=0x1a80b5a80, dst=0x0) at /usr/local/include/rte_memcpy.h:856
#4  rte_memcpy (n=88, src=0x1a80b5a80, dst=0x0) at /usr/local/include/rte_memcpy.h:872
#5  parse_something (flow=0x7ff7c83c8288, id=60806, 
    data=0x7ff82cd77cc5 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", datalen=89, flags=4) at main.c:1187
#6  0x000055555557c2e1 in process_something (result=0x7fffed7fad88) at main.c:2147
#7  0x000055555557c467 in some_flow (worker=0x7fffed7fad70, result=0x7fffed7fad88) at main.c:2199
#8  0x000055555557e5e0 in some_loop (arg=0x5555556262f0) at main.c:2273

我想知道这里出了什么问题,我是不是遗漏了一些 EAL 配置。在那之前,我正在查看文档并尝试从 DPDK 程序员指南(具体是 EAL、Mbuf、Mempool 库)中理解。

机器规格

如果我在上面的详细信息中遗漏了什么,请告诉我

正如评论中指出的那样,乘法必须给出一个数值。否则将使用 fx->var 的 ASCII 值。因此,评论中的建议是使用 atoi(fx->var) 将数字字符串转换为 int 值。

注意:通过修改代码片段,我可以得到它 运行,因此 rte_malloc.

没有问题

修改后的代码:

#include <rte_eal.h>
#include <rte_memcpy.h>
#include <rte_string_fns.h>
#include <rte_malloc.h>

char *mystring = "test my string: ";
char *data = "My Data.. ";
int datalen = 10;

int main(int argc, char **argv)
{
        if (0 == rte_eal_init(argc, argv))
                rte_exit(EXIT_FAILURE, "failed to init!");

        int current_length = strlen(mystring);
        int new_length = (datalen + current_length) + 1;

        //char *temp = (char *)rte_malloc("char *", new_length * (*mystring), 0);
        char *temp = (char *)rte_malloc("char *", new_length, 0);
        if (temp == NULL)
                rte_exit(EXIT_FAILURE, "temp is null!");

        rte_strlcat(temp, mystring, current_length);
        rte_strlcat(temp + current_length - 1, data, datalen);
        temp[new_length] = '[=10=]';

        mystring = (char *)rte_malloc("var", new_length * (*mystring), 0);
        if (mystring == NULL)
                rte_exit(EXIT_FAILURE, "mystring is null!");

        rte_memcpy(mystring, temp, new_length);
        mystring[new_length] = '[=10=]';

        printf("(%s)!\n\n", mystring);
        rte_free(temp);

        printf("Done!");

构建命令:gcc /tmp/t.c $(pkg-config --cflags --libs --static libdpdk) -g

执行命令: sudo ./a.out --no-pci

[Edit-1] 使用 Abid Zaidi

建议的测试字符串更新

结果:(测试我的 string:My 数据..)!