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 439EC1B4BA for ; Thu, 29 Nov 2018 14:21:36 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9CBEAC0669BA; Thu, 29 Nov 2018 13:21:35 +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 5B7C91019626; Thu, 29 Nov 2018 13:21:34 +0000 (UTC) From: Kevin Traynor To: Beilei Xing Cc: Konstantin Ananyev , dpdk stable Date: Thu, 29 Nov 2018 13:20:02 +0000 Message-Id: <20181129132128.7609-2-ktraynor@redhat.com> In-Reply-To: <20181129132128.7609-1-ktraynor@redhat.com> References: <20181129132128.7609-1-ktraynor@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 29 Nov 2018 13:21:35 +0000 (UTC) Subject: [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:21:36 -0000 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. 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 -- 2.19.0 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2018-11-29 13:09:47.577168286 +0000 +++ 0001-net-i40e-fix-Rx-instability-with-vector-mode.patch 2018-11-29 13:09:47.000000000 +0000 @@ -1,8 +1,10 @@ -From 054d1be48cc114c5d3bf87c7ebdf46703876e8d5 Mon Sep 17 00:00:00 2001 +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 @@ -12,7 +14,6 @@ Fixes: 8e109464c022 ("i40e: allow vector Rx and Tx usage") Fixes: a3c83a2527e1 ("net/i40e: enable runtime queue setup") -Cc: stable@dpdk.org Signed-off-by: Beilei Xing Acked-by: Konstantin Ananyev @@ -23,11 +24,11 @@ 3 files changed, 50 insertions(+) diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst -index ab3928a68..bfacbd117 100644 +index 65d87f869..643756dcd 100644 --- a/doc/guides/nics/i40e.rst +++ b/doc/guides/nics/i40e.rst -@@ -173,4 +173,11 @@ Runtime Config Options - -w 84:00.0,use-latest-supported-vec=1 +@@ -164,4 +164,11 @@ Runtime Config Options + representors must be specified on the creation of the PF. +Vector RX Pre-conditions +~~~~~~~~~~~~~~~~~~~~~~~~ @@ -39,10 +40,10 @@ Driver compilation and testing ------------------------------ diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c -index e76412207..e1152ff0e 100644 +index 26c2f17bd..e0d53d022 100644 --- a/drivers/net/i40e/i40e_rxtx.c +++ b/drivers/net/i40e/i40e_rxtx.c -@@ -1742,4 +1742,9 @@ i40e_dev_rx_queue_setup_runtime(struct rte_eth_dev *dev, +@@ -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)) { @@ -53,7 +54,7 @@ } diff --git a/drivers/net/i40e/i40e_rxtx_vec_common.h b/drivers/net/i40e/i40e_rxtx_vec_common.h -index f00f6d648..0e6ffa007 100644 +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) @@ -68,7 +69,7 @@ + bool first_queue; /* no fdir support */ -@@ -208,4 +213,37 @@ i40e_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev) +@@ -210,4 +215,37 @@ i40e_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev) return -1; + /**