DPDK 16.07 introduced the support for mempool offload support. rte_pktmbuf_pool_create is the recommended method for creating pktmbuf pools. Buffer pools created with rte_mempool_create may not get offloaded to the underlying offloaded mempools.
This patch, changes the rte_mempool_create to use helper wrapper "rte_pktmbuf_pool_create" provided by dpdk, so that it can leverage offloaded mempools. Signed-off-by: Hemant Agrawal <[email protected]> --- v3: * adding OVS_UNUSED for mp parameter v2: * removing rte_pktmbuf_init as per review comment lib/netdev-dpdk.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index ddc651b..39021cf 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -451,22 +451,19 @@ free_dpdk_buf(struct dp_packet *p) } static void -ovs_rte_pktmbuf_init(struct rte_mempool *mp, +ovs_rte_pktmbuf_init(struct rte_mempool *mp OVS_UNUSED, void *opaque_arg OVS_UNUSED, void *_p, unsigned i OVS_UNUSED) { struct rte_mbuf *pkt = _p; - rte_pktmbuf_init(mp, opaque_arg, _p, i); - dp_packet_init_dpdk((struct dp_packet *) pkt, pkt->buf_len); } static struct dpdk_mp * dpdk_mp_create(int socket_id, int mtu) { - struct rte_pktmbuf_pool_private mbp_priv; struct dpdk_mp *dmp; unsigned mp_size; char *mp_name; @@ -478,9 +475,6 @@ dpdk_mp_create(int socket_id, int mtu) dmp->socket_id = socket_id; dmp->mtu = mtu; dmp->refcount = 1; - mbp_priv.mbuf_data_room_size = MBUF_SIZE(mtu) - sizeof(struct dp_packet); - mbp_priv.mbuf_priv_size = sizeof(struct dp_packet) - - sizeof(struct rte_mbuf); /* XXX: this is a really rough method of provisioning memory. * It's impossible to determine what the exact memory requirements are * when the number of ports and rxqs that utilize a particular mempool can @@ -496,18 +490,21 @@ dpdk_mp_create(int socket_id, int mtu) mp_name = xasprintf("ovs_mp_%d_%d_%u", dmp->mtu, dmp->socket_id, mp_size); - dmp->mp = rte_mempool_create(mp_name, mp_size, MBUF_SIZE(mtu), - MP_CACHE_SZ, - sizeof(struct rte_pktmbuf_pool_private), - rte_pktmbuf_pool_init, &mbp_priv, - ovs_rte_pktmbuf_init, NULL, - socket_id, 0); + dmp->mp = rte_pktmbuf_pool_create(mp_name, mp_size, + MP_CACHE_SZ, + sizeof (struct dp_packet) + - sizeof (struct rte_mbuf), + MBUF_SIZE(mtu) + - sizeof(struct dp_packet), + socket_id); if (dmp->mp) { VLOG_DBG("Allocated \"%s\" mempool with %u mbufs", mp_name, mp_size); } free(mp_name); if (dmp->mp) { + /* pktmbuf only prepare the rte_mbuf, prepare the ovs bufs */ + rte_mempool_obj_iter(dmp->mp, ovs_rte_pktmbuf_init, NULL); return dmp; } } while (rte_errno == ENOMEM && (mp_size /= 2) >= MIN_NB_MBUF); -- 1.9.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
