[dpdk-stable] patch 'net/i40e: fix Rx instability with vector mode' has been queued to stable release 18.08.1

Kevin Traynor ktraynor at redhat.com
Thu Nov 29 14:20:02 CET 2018


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 <beilei.xing at intel.com>
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 <beilei.xing at intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev at intel.com>
---
 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 <beilei.xing at intel.com>
 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 at dpdk.org
 
 Signed-off-by: Beilei Xing <beilei.xing at intel.com>
 Acked-by: Konstantin Ananyev <konstantin.ananyev at intel.com>
@@ -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;
  
 +	/**


More information about the stable mailing list