From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id ED7A9A6A for ; Mon, 2 Mar 2015 14:28:37 +0100 (CET) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga101.jf.intel.com with ESMTP; 02 Mar 2015 05:28:36 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,675,1418112000"; d="scan'208";a="461312123" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by FMSMGA003.fm.intel.com with ESMTP; 02 Mar 2015 05:22:28 -0800 Received: from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com [10.239.29.89]) by shvmail01.sh.intel.com with ESMTP id t22DSWkO009803; Mon, 2 Mar 2015 21:28:32 +0800 Received: from shecgisg004.sh.intel.com (localhost [127.0.0.1]) by shecgisg004.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id t22DSS5P032489; Mon, 2 Mar 2015 21:28:30 +0800 Received: (from cliang18@localhost) by shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id t22DSQVN032485; Mon, 2 Mar 2015 21:28:26 +0800 From: Cunming Liang To: dev@dpdk.org Date: Mon, 2 Mar 2015 21:28:24 +0800 Message-Id: <1425302904-32449-1-git-send-email-cunming.liang@intel.com> X-Mailer: git-send-email 1.7.4.1 Subject: [dpdk-dev] [PATCH v1] ixgbe/vector: add rxd 2^n check to avoid mbuf leak X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Mar 2015 13:28:38 -0000 The mbuf leak happens when the assigned number of rx descriptor is not power of 2. 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 --- The issue was reported in http://www.dpdk.org/ml/archives/dev/2015-February/014127.html lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 51 ++++++++++++++------------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c index 3059375..9ecf3e5 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; } -- 1.8.1.4