[dpdk-stable] patch 'net/hns3: fix crash with multi-process' has been queued to stable release 20.11.1

luca.boccassi at gmail.com luca.boccassi at gmail.com
Fri Feb 5 12:17:02 CET 2021


Hi,

FYI, your patch has been queued to stable release 20.11.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 02/07/21. 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. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/bluca/dpdk-stable

This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/708ae015b3797504a78cdd69d80d4ecb0e7e7a50

Thanks.

Luca Boccassi

---
>From 708ae015b3797504a78cdd69d80d4ecb0e7e7a50 Mon Sep 17 00:00:00 2001
From: "Min Hu (Connor)" <humin29 at huawei.com>
Date: Wed, 6 Jan 2021 11:46:31 +0800
Subject: [PATCH] net/hns3: fix crash with multi-process

[ upstream commit 6b978ead2bbef03f77dca495034fc6ba7eee347f ]

In current version, procedure of saving eth_dev in
hns3 PMD init will be called more than twice, one
for primary, the other for secondary. That will cause
segmentation fault in Multi-process as eth_dev will
be changed in secondary process, which is different
from one in primary process.

The initial problem was access to 'rte_eth_devices'
global variable, which is wrong. But current approach
can cause problem for the secondaries, moving 'eth_dev'
to process private can work but before making things
more complex.

This patch deserted the procedure of saving eth_dev in
hns3 PMD init. Instead, it creates an internal function
that gets "struct hns3_hw" as parameter and it can be
called internally without knowing 'eth_dev'and the
.dev_ops can be wrapper to this.

Fixes: 2390bf217f4d ("net/hns3: fix FEC state query")

Signed-off-by: Min Hu (Connor) <humin29 at huawei.com>
Signed-off-by: Lijun Ou <oulijun at huawei.com>
---
 drivers/net/hns3/hns3_ethdev.c | 16 ++++++++++------
 drivers/net/hns3/hns3_ethdev.h |  2 --
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index c94a325d25..3f6ba61a37 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -5812,10 +5812,9 @@ get_current_fec_auto_state(struct hns3_hw *hw, uint8_t *state)
 }
 
 static int
-hns3_fec_get(struct rte_eth_dev *dev, uint32_t *fec_capa)
+hns3_fec_get_internal(struct hns3_hw *hw, uint32_t *fec_capa)
 {
 #define QUERY_ACTIVE_SPEED	1
-	struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct hns3_sfp_speed_cmd *resp;
 	uint32_t tmp_fec_capa;
 	uint8_t auto_state;
@@ -5875,6 +5874,14 @@ hns3_fec_get(struct rte_eth_dev *dev, uint32_t *fec_capa)
 	return 0;
 }
 
+static int
+hns3_fec_get(struct rte_eth_dev *dev, uint32_t *fec_capa)
+{
+	struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+	return hns3_fec_get_internal(hw, fec_capa);
+}
+
 static int
 hns3_set_fec_hw(struct hns3_hw *hw, uint32_t mode)
 {
@@ -6008,10 +6015,9 @@ hns3_query_dev_fec_info(struct hns3_hw *hw)
 {
 	struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
 	struct hns3_pf *pf = HNS3_DEV_PRIVATE_TO_PF(hns);
-	struct rte_eth_dev *eth_dev = hns->eth_dev;
 	int ret;
 
-	ret = hns3_fec_get(eth_dev, &pf->fec_mode);
+	ret = hns3_fec_get_internal(hw, &pf->fec_mode);
 	if (ret)
 		hns3_err(hw, "query device FEC info failed, ret = %d", ret);
 
@@ -6097,8 +6103,6 @@ hns3_dev_init(struct rte_eth_dev *eth_dev)
 
 	PMD_INIT_FUNC_TRACE();
 
-	hns->eth_dev = eth_dev;
-
 	eth_dev->process_private = (struct hns3_process_private *)
 	    rte_zmalloc_socket("hns3_filter_list",
 			       sizeof(struct hns3_process_private),
diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h
index d59418b8c8..4c40df1cbb 100644
--- a/drivers/net/hns3/hns3_ethdev.h
+++ b/drivers/net/hns3/hns3_ethdev.h
@@ -743,8 +743,6 @@ struct hns3_adapter {
 		struct hns3_vf vf;
 	};
 
-	struct rte_eth_dev *eth_dev;
-
 	bool rx_simple_allowed;
 	bool rx_vec_allowed;
 	bool tx_simple_allowed;
-- 
2.29.2

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2021-02-05 11:18:35.252172744 +0000
+++ 0136-net-hns3-fix-crash-with-multi-process.patch	2021-02-05 11:18:29.018695148 +0000
@@ -1 +1 @@
-From 6b978ead2bbef03f77dca495034fc6ba7eee347f Mon Sep 17 00:00:00 2001
+From 708ae015b3797504a78cdd69d80d4ecb0e7e7a50 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 6b978ead2bbef03f77dca495034fc6ba7eee347f ]
+
@@ -26 +27,0 @@
-Cc: stable at dpdk.org
@@ -36 +37 @@
-index 7c34e382fb..90544fe328 100644
+index c94a325d25..3f6ba61a37 100644
@@ -39 +40 @@
-@@ -5821,10 +5821,9 @@ get_current_fec_auto_state(struct hns3_hw *hw, uint8_t *state)
+@@ -5812,10 +5812,9 @@ get_current_fec_auto_state(struct hns3_hw *hw, uint8_t *state)
@@ -51 +52 @@
-@@ -5884,6 +5883,14 @@ hns3_fec_get(struct rte_eth_dev *dev, uint32_t *fec_capa)
+@@ -5875,6 +5874,14 @@ hns3_fec_get(struct rte_eth_dev *dev, uint32_t *fec_capa)
@@ -66 +67 @@
-@@ -6017,10 +6024,9 @@ hns3_query_dev_fec_info(struct hns3_hw *hw)
+@@ -6008,10 +6015,9 @@ hns3_query_dev_fec_info(struct hns3_hw *hw)
@@ -78 +79 @@
-@@ -6106,8 +6112,6 @@ hns3_dev_init(struct rte_eth_dev *eth_dev)
+@@ -6097,8 +6103,6 @@ hns3_dev_init(struct rte_eth_dev *eth_dev)
@@ -88 +89 @@
-index 8d6b8cdbbc..31f78a175d 100644
+index d59418b8c8..4c40df1cbb 100644


More information about the stable mailing list