From: Cunming Liang Date: Mon, 2 Mar 2015 13:28:24 +0000 (+0800) Subject: ixgbe: check rxd number to avoid mbuf leak X-Git-Tag: spdx-start~9491 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=352078e8e196a2c1ca38e2d7303f4d69d1c4ec68;p=dpdk.git ixgbe: check rxd number to avoid mbuf leak The mbuf leak happens when the assigned number of rx descriptor is not power of 2 in vector mode. As it's presumed on vpmd rx (for rx_tail wrap), adding condition check to prevent it. The root cause reference code in *_recv_raw_pkts_vec* as below. "rxq->rx_tail = (uint16_t)(rxq->rx_tail & (rxq->nb_rx_desc - 1));". Reported-by: Stephen Hemminger Signed-off-by: Cunming Liang Acked-by: Bruce Richardson --- diff --git a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c index 3059375c0d..9ecf3e5fb5 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c +++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c @@ -2257,7 +2257,8 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, rxq->port_id, rxq->queue_id); dev->rx_pkt_burst = ixgbe_recv_pkts_bulk_alloc; #ifdef RTE_IXGBE_INC_VECTOR - if (!ixgbe_rx_vec_condition_check(dev)) { + if (!ixgbe_rx_vec_condition_check(dev) && + (rte_is_power_of_2(nb_desc))) { PMD_INIT_LOG(INFO, "Vector rx enabled, please make " "sure RX burst size no less than 32."); dev->rx_pkt_burst = ixgbe_recv_pkts_vec; @@ -3639,31 +3640,23 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev) buf_size = (uint16_t) ((srrctl & IXGBE_SRRCTL_BSIZEPKT_MASK) << IXGBE_SRRCTL_BSIZEPKT_SHIFT); - /* It adds dual VLAN length for supporting dual VLAN */ - if ((dev->data->dev_conf.rxmode.max_rx_pkt_len + + if (dev->data->dev_conf.rxmode.enable_scatter || + /* It adds dual VLAN length for supporting dual VLAN */ + (dev->data->dev_conf.rxmode.max_rx_pkt_len + 2 * IXGBE_VLAN_TAG_SIZE) > buf_size){ if (!dev->data->scattered_rx) PMD_INIT_LOG(DEBUG, "forcing scatter mode"); dev->data->scattered_rx = 1; #ifdef RTE_IXGBE_INC_VECTOR - dev->rx_pkt_burst = ixgbe_recv_scattered_pkts_vec; -#else - dev->rx_pkt_burst = ixgbe_recv_scattered_pkts; + if (rte_is_power_of_2(rxq->nb_rx_desc)) + dev->rx_pkt_burst = + ixgbe_recv_scattered_pkts_vec; + else #endif + dev->rx_pkt_burst = ixgbe_recv_scattered_pkts; } } - if (dev->data->dev_conf.rxmode.enable_scatter) { - if (!dev->data->scattered_rx) - PMD_INIT_LOG(DEBUG, "forcing scatter mode"); -#ifdef RTE_IXGBE_INC_VECTOR - dev->rx_pkt_burst = ixgbe_recv_scattered_pkts_vec; -#else - dev->rx_pkt_burst = ixgbe_recv_scattered_pkts; -#endif - dev->data->scattered_rx = 1; - } - /* * Device configured with multiple RX queues. */ @@ -4156,17 +4149,20 @@ ixgbevf_dev_rx_init(struct rte_eth_dev *dev) buf_size = (uint16_t) ((srrctl & IXGBE_SRRCTL_BSIZEPKT_MASK) << IXGBE_SRRCTL_BSIZEPKT_SHIFT); - /* It adds dual VLAN length for supporting dual VLAN */ - if ((dev->data->dev_conf.rxmode.max_rx_pkt_len + + if (dev->data->dev_conf.rxmode.enable_scatter || + /* It adds dual VLAN length for supporting dual VLAN */ + (dev->data->dev_conf.rxmode.max_rx_pkt_len + 2 * IXGBE_VLAN_TAG_SIZE) > buf_size) { if (!dev->data->scattered_rx) PMD_INIT_LOG(DEBUG, "forcing scatter mode"); dev->data->scattered_rx = 1; #ifdef RTE_IXGBE_INC_VECTOR - dev->rx_pkt_burst = ixgbe_recv_scattered_pkts_vec; -#else - dev->rx_pkt_burst = ixgbe_recv_scattered_pkts; + if (rte_is_power_of_2(rxq->nb_rx_desc)) + dev->rx_pkt_burst = + ixgbe_recv_scattered_pkts_vec; + else #endif + dev->rx_pkt_burst = ixgbe_recv_scattered_pkts; } } @@ -4184,17 +4180,6 @@ ixgbevf_dev_rx_init(struct rte_eth_dev *dev) IXGBE_PSRTYPE_RQPL_SHIFT; IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, psrtype); - if (dev->data->dev_conf.rxmode.enable_scatter) { - if (!dev->data->scattered_rx) - PMD_INIT_LOG(DEBUG, "forcing scatter mode"); -#ifdef RTE_IXGBE_INC_VECTOR - dev->rx_pkt_burst = ixgbe_recv_scattered_pkts_vec; -#else - dev->rx_pkt_burst = ixgbe_recv_scattered_pkts; -#endif - dev->data->scattered_rx = 1; - } - return 0; }