From ac6881ea6b6101d6de7b1e3900d47afaa08bcc2d Mon Sep 17 00:00:00 2001 From: Natalie Samsonov Date: Fri, 26 Jan 2018 08:55:22 +0100 Subject: [PATCH] net/mrvl: fix mbuf to bpool lookup Since in DPDK 17.11 port type was changed from uint8_t to uint16_t the MBUF_INVALID_PORT value became 0xffff but in mrvl_tx_pkt_burst() when trying to lookup bpool using mbuf port, we check if the port is invalid according to value 0xff. This causes segmentation fault. Solution: since the valid port value cannot exceed RTE_MAX_ETHPORTS (size of bpool lookup table) any other values consider as invalid so the packet should be returned to DPDK pool. Fixes: afb4d0d0bf91 ("net/mrvl: add Rx/Tx support") Cc: stable@dpdk.org Signed-off-by: Natalie Samsonov --- drivers/net/mrvl/mrvl_ethdev.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/mrvl/mrvl_ethdev.c b/drivers/net/mrvl/mrvl_ethdev.c index 3b60f91bba..705c4bd8b3 100644 --- a/drivers/net/mrvl/mrvl_ethdev.c +++ b/drivers/net/mrvl/mrvl_ethdev.c @@ -2096,8 +2096,9 @@ mrvl_tx_pkt_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) sq->ent[sq->head].buff.addr = rte_mbuf_data_iova_default(mbuf); sq->ent[sq->head].bpool = - (unlikely(mbuf->port == 0xff || mbuf->refcnt > 1)) ? - NULL : mrvl_port_to_bpool_lookup[mbuf->port]; + (unlikely(mbuf->port >= RTE_MAX_ETHPORTS || + mbuf->refcnt > 1)) ? NULL : + mrvl_port_to_bpool_lookup[mbuf->port]; sq->head = (sq->head + 1) & MRVL_PP2_TX_SHADOWQ_MASK; sq->size++; @@ -2430,6 +2431,7 @@ rte_pmd_mrvl_probe(struct rte_vdev_device *vdev) } memset(mrvl_port_bpool_size, 0, sizeof(mrvl_port_bpool_size)); + memset(mrvl_port_to_bpool_lookup, 0, sizeof(mrvl_port_to_bpool_lookup)); mrvl_lcore_first = RTE_MAX_LCORE; mrvl_lcore_last = 0; -- 2.20.1