From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 7BDDE1B3B0 for ; Thu, 29 Nov 2018 14:30:39 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D4AB33086272; Thu, 29 Nov 2018 13:30:38 +0000 (UTC) Received: from ktraynor.remote.csb (ovpn-117-230.ams2.redhat.com [10.36.117.230]) by smtp.corp.redhat.com (Postfix) with ESMTP id 47A4518780; Thu, 29 Nov 2018 13:30:36 +0000 (UTC) From: Kevin Traynor To: Beilei Xing Cc: Konstantin Ananyev , dpdk stable References: <20181129132128.7609-1-ktraynor@redhat.com> <20181129132128.7609-2-ktraynor@redhat.com> Organization: Red Hat Message-ID: <040a3fe1-7bb6-5b4a-8c56-638fa7d6e69f@redhat.com> Date: Thu, 29 Nov 2018 13:30:30 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.0 MIME-Version: 1.0 In-Reply-To: <20181129132128.7609-2-ktraynor@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Thu, 29 Nov 2018 13:30:38 +0000 (UTC) Subject: Re: [dpdk-stable] patch 'net/i40e: fix Rx instability with vector mode' has been queued to stable release 18.08.1 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 Nov 2018 13:30:39 -0000 On 11/29/2018 01:20 PM, Kevin Traynor wrote: > Hi, > > FYI, your patch has been queued to stable release 18.08.1 > > Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. > It will be pushed if I get no objections before 12/08/18. So please > shout if anyone has objections. > > Also note that after the patch there's a diff of the upstream commit vs the patch applied > to the branch. If the code is different (ie: not only metadata diffs), due for example to > a change in context or macro names, please double check it. > Hi, this is a resend to stable - previous version had a conflict in the docs because of context. > Thanks. > > Kevin Traynor > > --- > From 710f8e2bcf60798ad1d7236d2609a50491c599a4 Mon Sep 17 00:00:00 2001 > From: Beilei Xing > Date: Mon, 5 Nov 2018 11:18:12 +0800 > Subject: [PATCH] net/i40e: fix Rx instability with vector mode > > [ upstream commit 054d1be48cc114c5d3bf87c7ebdf46703876e8d5 ] > > Previously, there is instability during vector Rx if descriptor > number is not power of 2, e.g. process hang and some Rx packets > are unexpectedly empty. That's because vector Rx mode assumes Rx > descriptor number is power of 2 when doing bit mask. > This patch allows vector mode only when the number of Rx descriptor > is power of 2. > > Fixes: 8e109464c022 ("i40e: allow vector Rx and Tx usage") > Fixes: a3c83a2527e1 ("net/i40e: enable runtime queue setup") > > Signed-off-by: Beilei Xing > Acked-by: Konstantin Ananyev > --- > doc/guides/nics/i40e.rst | 7 +++++ > drivers/net/i40e/i40e_rxtx.c | 5 ++++ > drivers/net/i40e/i40e_rxtx_vec_common.h | 38 +++++++++++++++++++++++++ > 3 files changed, 50 insertions(+) > > diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst > index 65d87f869..643756dcd 100644 > --- a/doc/guides/nics/i40e.rst > +++ b/doc/guides/nics/i40e.rst > @@ -164,4 +164,11 @@ Runtime Config Options > representors must be specified on the creation of the PF. > > +Vector RX Pre-conditions > +~~~~~~~~~~~~~~~~~~~~~~~~ > +For Vector RX it is assumed that the number of descriptor rings will be a power > +of 2. With this pre-condition, the ring pointer can easily scroll back to the > +head after hitting the tail without a conditional check. In addition Vector RX > +can use this assumption to do a bit mask using ``ring_size - 1``. > + > Driver compilation and testing > ------------------------------ > diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c > index 26c2f17bd..e0d53d022 100644 > --- a/drivers/net/i40e/i40e_rxtx.c > +++ b/drivers/net/i40e/i40e_rxtx.c > @@ -1741,4 +1741,9 @@ i40e_dev_rx_queue_setup_runtime(struct rte_eth_dev *dev, > i40e_set_rx_function(dev); > return 0; > + } else if (ad->rx_vec_allowed && !rte_is_power_of_2(rxq->nb_rx_desc)) { > + PMD_DRV_LOG(ERR, "Vector mode is allowed, but descriptor" > + " number %d of queue %d isn't power of 2", > + rxq->nb_rx_desc, rxq->queue_id); > + return -EINVAL; > } > > diff --git a/drivers/net/i40e/i40e_rxtx_vec_common.h b/drivers/net/i40e/i40e_rxtx_vec_common.h > index 63cb17742..ccaffef99 100644 > --- a/drivers/net/i40e/i40e_rxtx_vec_common.h > +++ b/drivers/net/i40e/i40e_rxtx_vec_common.h > @@ -193,6 +193,11 @@ i40e_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev) > { > #ifndef RTE_LIBRTE_IEEE1588 > + struct i40e_adapter *ad = > + I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); > struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; > struct rte_fdir_conf *fconf = &dev->data->dev_conf.fdir_conf; > + struct i40e_rx_queue *rxq; > + uint16_t desc, i; > + bool first_queue; > > /* no fdir support */ > @@ -210,4 +215,37 @@ i40e_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev) > return -1; > > + /** > + * Vector mode is allowed only when number of Rx queue > + * descriptor is power of 2. > + */ > + if (!dev->data->dev_started) { > + first_queue = true; > + for (i = 0; i < dev->data->nb_rx_queues; i++) { > + rxq = dev->data->rx_queues[i]; > + if (!rxq) > + continue; > + desc = rxq->nb_rx_desc; > + if (first_queue) > + ad->rx_vec_allowed = > + rte_is_power_of_2(desc); > + else > + ad->rx_vec_allowed = > + ad->rx_vec_allowed ? > + rte_is_power_of_2(desc) : > + ad->rx_vec_allowed; > + first_queue = false; > + } > + } else { > + /* Only check the first queue's descriptor number */ > + for (i = 0; i < dev->data->nb_rx_queues; i++) { > + rxq = dev->data->rx_queues[i]; > + if (!rxq) > + continue; > + desc = rxq->nb_rx_desc; > + ad->rx_vec_allowed = rte_is_power_of_2(desc); > + break; > + } > + } > + > return 0; > #else >