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 81D705A74 for ; Thu, 5 Mar 2015 12:44:58 +0100 (CET) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP; 05 Mar 2015 03:44:44 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,346,1422950400"; d="scan'208";a="660824012" Received: from bricha3-mobl3.ger.corp.intel.com ([10.243.20.24]) by orsmga001.jf.intel.com with SMTP; 05 Mar 2015 03:44:40 -0800 Received: by (sSMTP sendmail emulation); Thu, 05 Mar 2015 11:44:39 +0025 Date: Thu, 5 Mar 2015 11:44:39 +0000 From: Bruce Richardson To: Cunming Liang Message-ID: <20150305114439.GA1504@bricha3-MOBL3> References: <1425302904-32449-1-git-send-email-cunming.liang@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1425302904-32449-1-git-send-email-cunming.liang@intel.com> Organization: Intel Shannon Ltd. User-Agent: Mutt/1.5.23 (2014-03-12) Cc: dev@dpdk.org Subject: Re: [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: Thu, 05 Mar 2015 11:44:59 -0000 On Mon, Mar 02, 2015 at 09:28:24PM +0800, Cunming Liang wrote: > 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 Acked-by: Bruce Richardson > --- > 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 >