dpdk 主从共享内存分析

static int

lcore_recv(__rte_unused void *arg)

{

       unsigned lcore_id = rte_lcore_id();

       printf("Starting core %u\n", lcore_id);

       while (!quit){

              void *msg;

              //出队列,指针传递

              if (rte_ring_dequeue(recv_ring, &msg) < 0){

                     usleep(5);

                     continue;

              }

              printf("core %u: Received '%s'\n", lcore_id, (char *)msg);

              //归还内存池

              rte_mempool_put(message_pool, msg);

       }

       return 0;

}

static void cmd_send_parsed(void *parsed_result,

              __rte_unused struct cmdline *cl,

              __rte_unused void *data)

{

       void *msg = NULL;

       struct cmd_send_result *res = parsed_result;

       //内存池取buffer

       if (rte_mempool_get(message_pool, &msg) < 0)

              rte_panic("Failed to get message buffer\n");

       strlcpy((char *)msg, res->message, STR_TOKEN_SIZE);

       //入队列指针传递

       if (rte_ring_enqueue(send_ring, msg) < 0) {

              printf("Failed to send message - message discarded\n");

              rte_mempool_put(message_pool, msg);

       }

}

./simple_mp -l 0-1 --proc-type=auto

int

main(int argc, char **argv)

{

       const unsigned flags = 0;

       const unsigned ring_size = 64;

       const unsigned pool_size = 1024;

       const unsigned pool_cache = 32;

       const unsigned priv_data_sz = 0;

       int ret;

       unsigned lcore_id;

       ret = rte_eal_init(argc, argv);

       if (ret < 0)

              rte_exit(EXIT_FAILURE, "Cannot init EAL\n");

       /* Start of ring structure. 8< */

       if (rte_eal_process_type() == RTE_PROC_PRIMARY){//主进程初始化

              //初始化收发队列和内存池

              send_ring = rte_ring_create(_PRI_2_SEC, ring_size, rte_socket_id(), flags);

              recv_ring = rte_ring_create(_SEC_2_PRI, ring_size, rte_socket_id(), flags);

              message_pool = rte_mempool_create(_MSG_POOL, pool_size,

                            STR_TOKEN_SIZE, pool_cache, priv_data_sz,

                            NULL, NULL, NULL, NULL,

                            rte_socket_id(), flags);

       } else {//从进程初始化

              //根据name查找收发队列和内存池

              recv_ring = rte_ring_lookup(_PRI_2_SEC);

              send_ring = rte_ring_lookup(_SEC_2_PRI);

              message_pool = rte_mempool_lookup(_MSG_POOL);

       }

       /* >8 End of ring structure. */

       if (send_ring == NULL)

              rte_exit(EXIT_FAILURE, "Problem getting sending ring\n");

       if (recv_ring == NULL)

              rte_exit(EXIT_FAILURE, "Problem getting receiving ring\n");

       if (message_pool == NULL)

              rte_exit(EXIT_FAILURE, "Problem getting message pool\n");

       RTE_LOG(INFO, APP, "Finished Process Init.\n");

       /* 避开主线程call lcore_recv() on every worker lcore */

       RTE_LCORE_FOREACH_WORKER(lcore_id) {

              rte_eal_remote_launch(lcore_recv, NULL, lcore_id);

       }

       /* CLI命令行支持call cmd prompt on main lcore */

       // simple_mp_ctx回调上下文

       struct cmdline *cl = cmdline_stdin_new(simple_mp_ctx, "\nsimple_mp > ");

       if (cl == NULL)

              rte_exit(EXIT_FAILURE, "Cannot create cmdline instance\n");

       cmdline_interact(cl);

       cmdline_stdin_exit(cl);

       rte_eal_mp_wait_lcore();

       /* clean up the EAL */

       rte_eal_cleanup();

       return 0;

}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值