首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >DPDK抛出EAL: eal_memalloc_alloc_seg_bulk():无法在字符串级联上找到合适的memseg_list

DPDK抛出EAL: eal_memalloc_alloc_seg_bulk():无法在字符串级联上找到合适的memseg_list
EN

Stack Overflow用户
提问于 2021-04-10 19:23:43
回答 1查看 858关注 0票数 1

我有一个DPDK环境设置,程序的buggy部分连接一个字符串。该字符串可以是只要它得到(假设一个1,000,000最大字符)。我用./program =‘0-4’运行我的程序

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

代码语言:javascript
代码运行次数:0
运行
复制
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] = '\0';


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

rte_free(temp);

我的程序在使用EAL: eal_memalloc_alloc_seg_bulk():无法找到合适的memseg_list之后退出。下面是我得到的堆栈跟踪

代码语言:javascript
代码运行次数:0
运行
复制
(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库中具体理解)中了解。

机器规格

20.11.0-rc1

  • Ubuntu 20 (x86_64 GNU/Linux内核5.8.0-44-generic)

  • CPU: 32

  • RAM: 256 GB

  • 2 DPDK端口(Igb_uio) 6-7 GB/s

  • 1GB Hugepages

f 219

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-12 09:36:36

正如在评论中指出的,乘法必须给出一个数值。否则,将使用fx->var的ASCII值。因此,共享注释中的建议,将atoi(fx->var)用于数字字符串到int值。

注意:通过修改代码片段,我能够启动并运行它,因此在rte_malloc中没有问题。

修改后的守则:

代码语言:javascript
代码运行次数:0
运行
复制
#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] = '\0';

        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] = '\0';

        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

使用Abid Zaidi建议的测试字符串更新的编辑-1

结果:(测试我的字符串:我的数据)!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67038388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档