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

luca.boccassi at gmail.com luca.boccassi at gmail.com
Thu Nov 3 10:27:33 CET 2022


Hi,

FYI, your patch has been queued to stable release 20.11.7

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/05/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/kevintraynor/dpdk-stable

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/dfb7b1acec2b9889be3a263d5472180d41aae795

Thanks.

Luca Boccassi

---
>From dfb7b1acec2b9889be3a263d5472180d41aae795 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 693b256ffb..eb075c8331 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -5458,7 +5458,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 c1cf7a8c60..be6e37d4b4 100644
--- a/drivers/net/hns3/hns3_ethdev_vf.c
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
@@ -2316,8 +2316,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.34.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2022-11-03 09:27:29.899932084 +0000
+++ 0075-net-hns3-fix-crash-when-secondary-process-access-FW.patch	2022-11-03 09:27:25.513425150 +0000
@@ -1 +1 @@
-From a8f1f7cf1b429c3b95fa94f794f697a30f4c482d Mon Sep 17 00:00:00 2001
+From dfb7b1acec2b9889be3a263d5472180d41aae795 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 693b256ffb..eb075c8331 100644
@@ -34 +35 @@
-@@ -5602,7 +5602,15 @@ hns3_is_reset_pending(struct hns3_adapter *hns)
+@@ -5458,7 +5458,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 c1cf7a8c60..be6e37d4b4 100644
@@ -55 +56 @@
-@@ -1864,8 +1864,15 @@ hns3vf_is_reset_pending(struct hns3_adapter *hns)
+@@ -2316,8 +2316,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