qq_48298178 2024-07-05 00:45 采纳率: 0%
浏览 9

DPDK应用编程问题

DPDK 应用程序开机后首次运行发送数据不成功,第二次运行就可以,为什么?下面是部分代码,帮忙看看。

static void port_init(struct rte_mempool *mbuf_pool)
{
    g_dpdkPortId = 0;
    while (g_dpdkPortId < RTE_MAX_ETHPORTS &&
           rte_eth_devices[g_dpdkPortId].data->owner.id != RTE_ETH_DEV_NO_OWNER)
    {
        g_dpdkPortId++;
    }
    if (g_dpdkPortId == RTE_MAX_ETHPORTS)
    {
        rte_exit(EXIT_FAILURE, "There were no DPDK ports free.\n");
    }
    const int num_rx_queues = 1;
    const int num_tx_queues = 1;
    struct rte_eth_conf port_conf = port_conf_default;
    if (rte_eth_dev_configure(g_dpdkPortId, num_rx_queues, num_tx_queues, &port_conf))
    {
        rte_exit(EXIT_FAILURE, "rte_eth_dev_configure() failed.\n");
    }
    if (rte_eth_tx_queue_setup(g_dpdkPortId, DPDK_QUEUE_ID_TX, TX_RING_SIZE,
                               rte_eth_dev_socket_id(g_dpdkPortId), NULL) < 0)
    {
        rte_exit(EXIT_FAILURE, "Couldn't setup TX queue.\n");
    }
    if (rte_eth_rx_queue_setup(g_dpdkPortId, DPDK_QUEUE_ID_RX, RX_RING_SIZE,
                               rte_eth_dev_socket_id(g_dpdkPortId), NULL, mbuf_pool) < 0)
    {
        rte_exit(EXIT_FAILURE, "Couldn't setup RX queue.\n");
    }
    if (rte_eth_dev_start(g_dpdkPortId) < 0)
    {
        rte_exit(EXIT_FAILURE, "Device start failed.\n");
    }
}
int main(int argc, char *argv[])
{
    struct timeval api_start_time, api_stop_time;
    int i, j, ret;
    uint32_t tx_count = 0;
    uint32_t PKG_SIZE = 2048;
    uint32_t SEND_TIMES = 10000000;
    if (rte_eal_init(argc, argv) < 0)
    {
        rte_exit(EXIT_FAILURE, "Error with EAL initialization\n");
    }
    struct rte_mempool *mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS,
                                                            MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
    if (!mbuf_pool)
    {
        rte_exit(EXIT_FAILURE, "Couldn't create mbuf pool\n");
    }

    port_init(mbuf_pool);
}
  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-05 00:45
    关注

    引自免费微信小程序:皆我百晓生

    这个问题涉及到DPDK应用程序在不同操作系统(例如Linux和Windows)中的启动行为差异。DPDK应用程序通常在启动时会尝试从内存池分配缓冲区用于接收和发送数据。然而,在某些情况下,可能会遇到内存不足的问题。

    首先,我们需要理解DPDK应用程序是如何初始化环境抽象层(EAL)的。EAL是一个基础的API,它提供了对底层硬件资源的操作接口,如内存管理、I/O操作等。在您的代码中,rte_eal_init()函数被调用来初始化EAL。这个函数的参数包括了应用程序要使用的内存池。

    其次,我们需要注意的是,DPDK应用程序在不同的操作系统上可能有不同的内存分配策略。例如,Linux系统倾向于使用内核空间的内存池,而Windows系统则更倾向于使用用户空间的内存池。这可能导致在不同操作系统上的DPDK应用程序在启动时遇到内存不足的问题。

    为了解决这个问题,您可以通过修改DPDK应用程序的配置文件来改变内存池的选择。例如,您可以将EAL初始化函数的参数之一改为一个内存池的名称。然后,您可以根据您的需求选择合适的内存池。

    此外,您还可以考虑使用一些工具,如rte_dpm_set()函数,来调整DPDK应用程序的内存分配策略。这些工具可以帮助您更好地控制内存的使用,并确保应用程序能够在启动时正常工作。

    下面是一个示例代码片段,展示了如何使用rte_dpm_set()函数来调整内存分配策略:

    // 假设您已经创建了一个名为"my_memory_pool"的内存池
    
    rte_dpm_set(rte_dpm_policy_rtl_memory_pool, my_memory_pool);
    

    这段代码将DPDK应用程序的内存分配策略更改为使用"my_memory_pool"作为内存池。您可以在实际应用中替换此内存池名称为您想要的任何其他内存池。

    注意:以上代码仅为示例,具体实现应根据您的应用程序需求进行定制。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月5日
  • 创建了问题 7月5日

悬赏问题

  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊