[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
Fri Nov 23 11:26:50 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 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 <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 | 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 <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,23 +14,43 @@
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>
---
- 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;
+ /**
More information about the stable
mailing list