Bulk alloc mbufs in dpdk_send(). Combined with dpdk mempool cache size increase this improves odp_l2fwd throughput by 5-10 %.
Signed-off-by: Matias Elo <[email protected]> --- platform/linux-generic/include/odp_packet_dpdk.h | 2 +- platform/linux-generic/pktio/dpdk.c | 28 ++++++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/platform/linux-generic/include/odp_packet_dpdk.h b/platform/linux-generic/include/odp_packet_dpdk.h index 31e1ed7..c63685e 100644 --- a/platform/linux-generic/include/odp_packet_dpdk.h +++ b/platform/linux-generic/include/odp_packet_dpdk.h @@ -20,7 +20,7 @@ #define DPDK_MEMORY_MB 512 #define DPDK_NB_MBUF 16384 #define DPDK_MBUF_BUF_SIZE RTE_MBUF_DEFAULT_BUF_SIZE -#define DPDK_MEMPOOL_CACHE_SIZE 32 +#define DPDK_MEMPOOL_CACHE_SIZE 64 #define DPDK_NM_RX_DESC 128 #define DPDK_NM_TX_DESC 512 diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index 0a800b7..99eb868 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -826,36 +826,36 @@ static inline int pkt_to_mbuf(pktio_entry_t *pktio_entry, const odp_packet_t pkt_table[], uint16_t num) { pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk; - int i; + int i, j; char *data; uint16_t pkt_len; + if (odp_unlikely((rte_pktmbuf_alloc_bulk(pkt_dpdk->pkt_pool, + mbuf_table, num)))) { + ODP_ERR("Failed to alloc mbuf\n"); + return 0; + } for (i = 0; i < num; i++) { pkt_len = odp_packet_len(pkt_table[i]); if (pkt_len > pkt_dpdk->mtu) { if (i == 0) __odp_errno = EMSGSIZE; - break; - } - - mbuf_table[i] = rte_pktmbuf_alloc(pkt_dpdk->pkt_pool); - if (mbuf_table[i] == NULL) { - ODP_ERR("Failed to alloc mbuf\n"); - break; + goto fail; } + /* Packet always fits in mbuf */ data = rte_pktmbuf_append(mbuf_table[i], pkt_len); - if (data == NULL) { - ODP_ERR("Failed to append mbuf\n"); - rte_pktmbuf_free(mbuf_table[i]); - break; - } - odp_packet_copy_to_mem(pkt_table[i], 0, pkt_len, data); } return i; + +fail: + for (j = i; j < num; j++) + rte_pktmbuf_free(mbuf_table[j]); + + return i; } static int dpdk_recv(pktio_entry_t *pktio_entry, int index, -- 2.7.4
