patch 'net/hns3: fix crash when secondary process access FW' has been queued to stable release 19.11.14

christian.ehrhardt at canonical.com christian.ehrhardt at canonical.com
Fri Nov 11 12:38:50 CET 2022


Hi,

FYI, your patch has been queued to stable release 19.11.14

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/18/22. 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/cpaelzer/dpdk-stable-queue

This queued commit can be viewed at:
https://github.com/cpaelzer/dpdk-stable-queue/commit/10690bdfc448c47b6d739880f98dbda67f6134bc

Thanks.

Christian Ehrhardt <christian.ehrhardt at canonical.com>

---
>From 10690bdfc448c47b6d739880f98dbda67f6134bc Mon Sep 17 00:00:00 2001
From: Chengwen Feng <fengchengwen at huawei.com>
Date: Mon, 5 Sep 2022 16:59:36 +0800
Subject: [PATCH] net/hns3: fix crash when secondary process access FW

[ upstream commit a8f1f7cf1b429c3b95fa94f794f697a30f4c482d ]

Currently, to prevent missing reporting of reset interrupts and quickly
identify reset interrupts, the following logic is designed in the
FW (firmware) command interface hns3_cmd_send: if an unprocessed
interrupt exist (by checking reset registers), related reset task is
scheduled.

The secondary process may invoke the hns3_cmd_send interface (e.g. using
proc-info query some stats). Unfortunately, the secondary process
does not support reset processing, and a segment fault may occur if it
schedules reset task.

Fix it by limit the checking and scheduling of reset under only primary
process.

Fixes: 2790c6464725 ("net/hns3: support device reset")

Signed-off-by: Chengwen Feng <fengchengwen at huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3 at huawei.com>
---
 drivers/net/hns3/hns3_ethdev.c    | 10 +++++++++-
 drivers/net/hns3/hns3_ethdev_vf.c | 11 +++++++++--
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index 1a8d729bc4..4cf3eb1b47 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -4999,7 +4999,15 @@ hns3_is_reset_pending(struct hns3_adapter *hns)
 	struct hns3_hw *hw = &hns->hw;
 	enum hns3_reset_level reset;
 
-	hns3_check_event_cause(hns, NULL);
+	/*
+	 * Check the registers to confirm whether there is reset pending.
+	 * Note: This check may lead to schedule reset task, but only primary
+	 *       process can process the reset event. Therefore, limit the
+	 *       checking under only primary process.
+	 */
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+		hns3_check_event_cause(hns, NULL);
+
 	reset = hns3_get_reset_level(hns, &hw->reset.pending);
 	if (hw->reset.level != HNS3_NONE_RESET && hw->reset.level < reset) {
 		hns3_warn(hw, "High level reset %d is pending", reset);
diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c
index 29a483b2f4..6e1d868a91 100644
--- a/drivers/net/hns3/hns3_ethdev_vf.c
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
@@ -1918,8 +1918,15 @@ hns3vf_is_reset_pending(struct hns3_adapter *hns)
 	if (hw->reset.level == HNS3_VF_FULL_RESET)
 		return false;
 
-	/* Check the registers to confirm whether there is reset pending */
-	hns3vf_check_event_cause(hns, NULL);
+	/*
+	 * Check the registers to confirm whether there is reset pending.
+	 * Note: This check may lead to schedule reset task, but only primary
+	 *       process can process the reset event. Therefore, limit the
+	 *       checking under only primary process.
+	 */
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+		hns3vf_check_event_cause(hns, NULL);
+
 	reset = hns3vf_get_reset_level(hw, &hw->reset.pending);
 	if (hw->reset.level != HNS3_NONE_RESET && hw->reset.level < reset) {
 		hns3_warn(hw, "High level reset %d is pending", reset);
-- 
2.38.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2022-11-11 12:35:05.950534697 +0100
+++ 0033-net-hns3-fix-crash-when-secondary-process-access-FW.patch	2022-11-11 12:35:04.789192151 +0100
@@ -1 +1 @@
-From a8f1f7cf1b429c3b95fa94f794f697a30f4c482d Mon Sep 17 00:00:00 2001
+From 10690bdfc448c47b6d739880f98dbda67f6134bc Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit a8f1f7cf1b429c3b95fa94f794f697a30f4c482d ]
+
@@ -21 +22,0 @@
-Cc: stable at dpdk.org
@@ -31 +32 @@
-index 95d3c93c42..3d9f7c6ec7 100644
+index 1a8d729bc4..4cf3eb1b47 100644
@@ -34 +35 @@
-@@ -5602,7 +5602,15 @@ hns3_is_reset_pending(struct hns3_adapter *hns)
+@@ -4999,7 +4999,15 @@ hns3_is_reset_pending(struct hns3_adapter *hns)
@@ -49,2 +50,2 @@
- 	if (reset != HNS3_NONE_RESET && hw->reset.level != HNS3_NONE_RESET &&
- 	    hw->reset.level < reset) {
+ 	if (hw->reset.level != HNS3_NONE_RESET && hw->reset.level < reset) {
+ 		hns3_warn(hw, "High level reset %d is pending", reset);
@@ -52 +53 @@
-index 86f2ba24cc..a72535eb7d 100644
+index 29a483b2f4..6e1d868a91 100644
@@ -55 +56 @@
-@@ -1864,8 +1864,15 @@ hns3vf_is_reset_pending(struct hns3_adapter *hns)
+@@ -1918,8 +1918,15 @@ hns3vf_is_reset_pending(struct hns3_adapter *hns)
@@ -71,2 +72,2 @@
- 	if (hw->reset.level != HNS3_NONE_RESET && reset != HNS3_NONE_RESET &&
- 	    hw->reset.level < reset) {
+ 	if (hw->reset.level != HNS3_NONE_RESET && hw->reset.level < reset) {
+ 		hns3_warn(hw, "High level reset %d is pending", reset);


More information about the stable mailing list