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 68F091B42C for ; Fri, 23 Nov 2018 11:30:11 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 896B38762F; Fri, 23 Nov 2018 10:30:10 +0000 (UTC) Received: from ktraynor.remote.csb (unknown [10.36.118.7]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2177717DA1; Fri, 23 Nov 2018 10:30:08 +0000 (UTC) From: Kevin Traynor To: Beilei Xing Cc: Konstantin Ananyev , dpdk stable Date: Fri, 23 Nov 2018 10:26:50 +0000 Message-Id: <20181123102713.17309-46-ktraynor@redhat.com> In-Reply-To: <20181123102713.17309-1-ktraynor@redhat.com> References: <20181123102713.17309-1-ktraynor@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Fri, 23 Nov 2018 10:30:10 +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: Fri, 23 Nov 2018 10:30:11 -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 11/29/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 b9d615675c577192f26e1203c54c70aa22f483fd 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 | 29 +++++++++++++++++++ drivers/net/i40e/i40e_rxtx.c | 5 ++++ drivers/net/i40e/i40e_rxtx_vec_common.h | 38 +++++++++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst index 65d87f869..003257ccc 100644 --- a/doc/guides/nics/i40e.rst +++ b/doc/guides/nics/i40e.rst @@ -164,4 +164,33 @@ Runtime Config Options representors must be specified on the creation of the PF. +<<<<<<< HEAD +||||||| merged common ancestors +- ``Use latest supported vector`` (default ``disable``) + + Latest supported vector path may not always get the best perf so vector path was + recommended to use only on later platform. But users may want the latest vector path + since it can get better perf in some real work loading cases. So ``devargs`` param + ``use-latest-supported-vec`` is introduced, for example:: + + -w 84:00.0,use-latest-supported-vec=1 + +======= +- ``Use latest supported vector`` (default ``disable``) + + Latest supported vector path may not always get the best perf so vector path was + recommended to use only on later platform. But users may want the latest vector path + since it can get better perf in some real work loading cases. So ``devargs`` param + ``use-latest-supported-vec`` is introduced, for example:: + + -w 84:00.0,use-latest-supported-vec=1 + +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``. + +>>>>>>> net/i40e: fix Rx instability with vector mode 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-23 10:22:55.456409870 +0000 +++ 0046-net-i40e-fix-Rx-instability-with-vector-mode.patch 2018-11-23 10:22:54.000000000 +0000 @@ -1,8 +1,10 @@ -From 054d1be48cc114c5d3bf87c7ebdf46703876e8d5 Mon Sep 17 00:00:00 2001 +From b9d615675c577192f26e1203c54c70aa22f483fd 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,23 +14,43 @@ 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 --- - doc/guides/nics/i40e.rst | 7 +++++ + doc/guides/nics/i40e.rst | 29 +++++++++++++++++++ drivers/net/i40e/i40e_rxtx.c | 5 ++++ drivers/net/i40e/i40e_rxtx_vec_common.h | 38 +++++++++++++++++++++++++ - 3 files changed, 50 insertions(+) + 3 files changed, 72 insertions(+) diff --git a/doc/guides/nics/i40e.rst b/doc/guides/nics/i40e.rst -index ab3928a68..bfacbd117 100644 +index 65d87f869..003257ccc 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,33 @@ Runtime Config Options + representors must be specified on the creation of the PF. ++<<<<<<< HEAD ++||||||| merged common ancestors ++- ``Use latest supported vector`` (default ``disable``) ++ ++ Latest supported vector path may not always get the best perf so vector path was ++ recommended to use only on later platform. But users may want the latest vector path ++ since it can get better perf in some real work loading cases. So ``devargs`` param ++ ``use-latest-supported-vec`` is introduced, for example:: ++ ++ -w 84:00.0,use-latest-supported-vec=1 ++ ++======= ++- ``Use latest supported vector`` (default ``disable``) ++ ++ Latest supported vector path may not always get the best perf so vector path was ++ recommended to use only on later platform. But users may want the latest vector path ++ since it can get better perf in some real work loading cases. So ``devargs`` param ++ ``use-latest-supported-vec`` is introduced, for example:: ++ ++ -w 84:00.0,use-latest-supported-vec=1 ++ +Vector RX Pre-conditions +~~~~~~~~~~~~~~~~~~~~~~~~ +For Vector RX it is assumed that the number of descriptor rings will be a power @@ -36,13 +58,14 @@ +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``. + ++>>>>>>> net/i40e: fix Rx instability with vector mode 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 +76,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 +91,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; + /**