欢迎来到 DPDK交流社区 ,有什么问题可以尽管在这里提问,您将会收到社区其他成员的回答;也可以将您的总结写在这里,为社区其他成员提供帮助。 (QQ交流群:127163755)

ip_reassembly例程中的内存池初始化大小怎么理解

+1 投票
/${RTE_SDK}/examples/ip_reassembly全程中,为每一个RX都创建了mempool,mempool的大小。请问RTE_MAX(max_flow_num, 2UL * MAX_PKT_BURST) 怎么理解?为什么max_flow_num和2UL * MAX_PKT_BURST的最大值,而不是取两者的和。原码如下:

        nb_mbuf = RTE_MAX(max_flow_num, 2UL * MAX_PKT_BURST) * MAX_FRAG_NUM;
        nb_mbuf *= (port_conf.rxmode.max_rx_pkt_len + BUF_SIZE - 1) / BUF_SIZE;
        nb_mbuf *= 2; /* ipv4 and ipv6 */
        nb_mbuf += RTE_TEST_RX_DESC_DEFAULT + RTE_TEST_TX_DESC_DEFAULT;

        nb_mbuf = RTE_MAX(nb_mbuf, (uint32_t)NB_MBUF);

        snprintf(buf, sizeof(buf), "mbuf_pool_%u_%u", lcore, queue);

        if ((rxq->pool = rte_mempool_create(buf, nb_mbuf, MBUF_SIZE, 0,
                        sizeof(struct rte_pktmbuf_pool_private),
                        rte_pktmbuf_pool_init, NULL, rte_pktmbuf_init, NULL,
                        socket, MEMPOOL_F_SP_PUT | MEMPOOL_F_SC_GET)) == NULL) {
                RTE_LOG(ERR, IP_RSMBL, "mempool_create(%s) failed", buf);
                return -1;
        }
最新提问 6月 10, 2015 分类:DPDK sample解惑 | 用户: neptuntiansea (160 分)

1个回答

+1 投票

这个问题在手册上有的,具体摘录如下,请参考:

7.4.2 Mempools Initialization
The reassembly application demands a lot of mbuf’s to be allocated. At any given time
up to (2 * max_flow_num * RTE_LIBRTE_IP_FRAG_MAX_FRAGS * <maximum number of
mbufs per packet>) can be stored inside Fragment Table waiting for remaining
fragments. To keep mempool size under reasonable limits and to avoid situation when
one RX queue can starve other queues, each RX queue uses its own mempool.

 

参考手册为:《intel-dpdk-sample-applications-user-guide》

http://www.dpdk.org/doc/pdf-guides/sample_app_ug-2.0.pdf

最新回答 6月 11, 2015 用户: oops (2,170 分)
我看了这一段。这一段并不能说明RTE_MAX(max_flow_num, 2UL * MAX_PKT_BURST)是为什么
...