dpdk/0394-net-hns3-fix-mailbox-sync.patch
Dengdui Huang bc76778e92 sync some patchs from upstreaming
Sync some patchs from upstreaming and modifies are as follow:
- net/hns3: fix mailbox sync
- net/hns3: report maximum buffer size
- ethdev: add maximum Rx buffer size
- app/procinfo: show RSS hash algorithm
- ethdev: get RSS algorithm names
- app/procinfo: adjust format of RSS info
- app/procinfo: fix RSS info
- net/hns3: support setting and querying RSS hash function
- net/hns3: report RSS hash algorithms capability
- ethdev: set and query RSS hash algorithm
- ethdev: clarify RSS related fields usage
- net/hns3: fix uninitialized hash algo value
- net/hns3: keep set/get algo key functions local
- net/hns3: fix some error logs
- net/hns3: fix some return values
- net/hns3: fix LRO offload to report
- net/hns3: fix setting DCB capability
- app/testpmd: ease configuring all offloads
- net/hns3: refactor interrupt state query
- net/hns3: fix IMP or global reset
- net/hns3: fix multiple reset detected log
- net/hns3: remove reset log in secondary
- net/hns3: fix double stats for IMP and global reset
- net/hns3: fix crash for NEON and SVE
- net/hns3: fix unchecked Rx free threshold
- net/hns3: fix typo in function name
- net/hns3: fix build warning
- telemetry: fix repeat display when callback don't init dict

Signed-off-by: Dengdui Huang <huangdengdui@huawei.com>
2023-11-21 21:38:03 +08:00

251 lines
8.6 KiB
Diff

From fc4a8dfe7b91702f2930957840a51796ffb12c2d Mon Sep 17 00:00:00 2001
From: Dengdui Huang <huangdengdui@huawei.com>
Date: Sat, 11 Nov 2023 09:59:14 +0800
Subject: [PATCH 394/394] net/hns3: fix mailbox sync
[ upstream commit be3590f54d0e415c23d4ed6ea55d967139c3ad10 ]
Currently, hns3 VF driver uses the following points to match
the response and request message for the mailbox synchronous
message between VF and PF.
1. req_msg_data which is consist of message code and subcode,
is used to match request and response.
2. head means the number of send success for VF.
3. tail means the number of receive success for VF.
4. lost means the number of send timeout for VF.
And 'head', 'tail' and 'lost' are dynamically updated during
the communication.
Now there is a issue that all sync mailbox message will
send failure forever at the flollowing case:
1. VF sends the message A
then head=UINT32_MAX-1, tail=UINT32_MAX-3, lost=2.
2. VF sends the message B
then head=UINT32_MAX, tail=UINT32_MAX-2, lost=2.
3. VF sends the message C, the message will be timeout because
it can't get the response within 500ms.
then head=0, tail=0, lost=2
note: tail is assigned to head if tail > head according to
current code logic. From now on, all subsequent sync milbox
messages fail to be sent.
It's very complicated to use the fields 'lost','tail','head'.
The code and subcode of the request sync mailbox are used as the
matching code of the message, which is used to match the response
message for receiving the synchronization response.
This patch drops these fields and uses the following solution
to solve this issue:
In the handling response message process, using the req_msg_data
of the request and response message to judge whether the sync
mailbox message has been received.
Fixes: 463e748964f5 ("net/hns3: support mailbox")
Cc: stable@dpdk.org
Signed-off-by: Dengdui Huang <huangdengdui@huawei.com>
Signed-off-by: Jie Hai <haijie1@huawei.com>
Acked-by: Huisong Li <lihuisong@huawei.com>
---
drivers/net/hns3/hns3_cmd.c | 3 --
drivers/net/hns3/hns3_mbx.c | 81 ++++++-------------------------------
drivers/net/hns3/hns3_mbx.h | 10 -----
3 files changed, 13 insertions(+), 81 deletions(-)
diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c
index a5c4c11dc8..2c1664485b 100644
--- a/drivers/net/hns3/hns3_cmd.c
+++ b/drivers/net/hns3/hns3_cmd.c
@@ -731,9 +731,6 @@ hns3_cmd_init(struct hns3_hw *hw)
hw->cmq.csq.next_to_use = 0;
hw->cmq.crq.next_to_clean = 0;
hw->cmq.crq.next_to_use = 0;
- hw->mbx_resp.head = 0;
- hw->mbx_resp.tail = 0;
- hw->mbx_resp.lost = 0;
hns3_cmd_init_regs(hw);
rte_spinlock_unlock(&hw->cmq.crq.lock);
diff --git a/drivers/net/hns3/hns3_mbx.c b/drivers/net/hns3/hns3_mbx.c
index 8e0a58aa02..f1743c195e 100644
--- a/drivers/net/hns3/hns3_mbx.c
+++ b/drivers/net/hns3/hns3_mbx.c
@@ -40,23 +40,6 @@ hns3_resp_to_errno(uint16_t resp_code)
return -EIO;
}
-static void
-hns3_mbx_proc_timeout(struct hns3_hw *hw, uint16_t code, uint16_t subcode)
-{
- if (hw->mbx_resp.matching_scheme ==
- HNS3_MBX_RESP_MATCHING_SCHEME_OF_ORIGINAL) {
- hw->mbx_resp.lost++;
- hns3_err(hw,
- "VF could not get mbx(%u,%u) head(%u) tail(%u) "
- "lost(%u) from PF",
- code, subcode, hw->mbx_resp.head, hw->mbx_resp.tail,
- hw->mbx_resp.lost);
- return;
- }
-
- hns3_err(hw, "VF could not get mbx(%u,%u) from PF", code, subcode);
-}
-
static int
hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode,
uint8_t *resp_data, uint16_t resp_len)
@@ -67,7 +50,6 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode,
struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
struct hns3_mbx_resp_status *mbx_resp;
uint32_t wait_time = 0;
- bool received;
if (resp_len > HNS3_MBX_MAX_RESP_DATA_SIZE) {
hns3_err(hw, "VF mbx response len(=%u) exceeds maximum(=%d)",
@@ -93,20 +75,14 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode,
hns3_dev_handle_mbx_msg(hw);
rte_delay_us(HNS3_WAIT_RESP_US);
- if (hw->mbx_resp.matching_scheme ==
- HNS3_MBX_RESP_MATCHING_SCHEME_OF_ORIGINAL)
- received = (hw->mbx_resp.head ==
- hw->mbx_resp.tail + hw->mbx_resp.lost);
- else
- received = hw->mbx_resp.received_match_resp;
- if (received)
+ if (hw->mbx_resp.received_match_resp)
break;
wait_time += HNS3_WAIT_RESP_US;
}
hw->mbx_resp.req_msg_data = 0;
if (wait_time >= mbx_time_limit) {
- hns3_mbx_proc_timeout(hw, code, subcode);
+ hns3_err(hw, "VF could not get mbx(%u,%u) from PF", code, subcode);
return -ETIME;
}
rte_io_rmb();
@@ -132,7 +108,6 @@ hns3_mbx_prepare_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode)
* we get the exact scheme which is used.
*/
hw->mbx_resp.req_msg_data = (uint32_t)code << 16 | subcode;
- hw->mbx_resp.head++;
/* Update match_id and ensure the value of match_id is not zero */
hw->mbx_resp.match_id++;
@@ -185,7 +160,6 @@ hns3_send_mbx_msg(struct hns3_hw *hw, uint16_t code, uint16_t subcode,
req->match_id = hw->mbx_resp.match_id;
ret = hns3_cmd_send(hw, &desc, 1);
if (ret) {
- hw->mbx_resp.head--;
rte_spinlock_unlock(&hw->mbx_resp.lock);
hns3_err(hw, "VF failed(=%d) to send mbx message to PF",
ret);
@@ -254,41 +228,10 @@ hns3_handle_asserting_reset(struct hns3_hw *hw,
hns3_schedule_reset(HNS3_DEV_HW_TO_ADAPTER(hw));
}
-/*
- * Case1: receive response after timeout, req_msg_data
- * is 0, not equal resp_msg, do lost--
- * Case2: receive last response during new send_mbx_msg,
- * req_msg_data is different with resp_msg, let
- * lost--, continue to wait for response.
- */
-static void
-hns3_update_resp_position(struct hns3_hw *hw, uint32_t resp_msg)
-{
- struct hns3_mbx_resp_status *resp = &hw->mbx_resp;
- uint32_t tail = resp->tail + 1;
-
- if (tail > resp->head)
- tail = resp->head;
- if (resp->req_msg_data != resp_msg) {
- if (resp->lost)
- resp->lost--;
- hns3_warn(hw, "Received a mismatched response req_msg(%x) "
- "resp_msg(%x) head(%u) tail(%u) lost(%u)",
- resp->req_msg_data, resp_msg, resp->head, tail,
- resp->lost);
- } else if (tail + resp->lost > resp->head) {
- resp->lost--;
- hns3_warn(hw, "Received a new response again resp_msg(%x) "
- "head(%u) tail(%u) lost(%u)", resp_msg,
- resp->head, tail, resp->lost);
- }
- rte_io_wmb();
- resp->tail = tail;
-}
-
static void
hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req)
{
+#define HNS3_MBX_RESP_CODE_OFFSET 16
struct hns3_mbx_resp_status *resp = &hw->mbx_resp;
uint32_t msg_data;
@@ -298,12 +241,6 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req)
* match_id to its response. So VF could use the match_id
* to match the request.
*/
- if (resp->matching_scheme !=
- HNS3_MBX_RESP_MATCHING_SCHEME_OF_MATCH_ID) {
- resp->matching_scheme =
- HNS3_MBX_RESP_MATCHING_SCHEME_OF_MATCH_ID;
- hns3_info(hw, "detect mailbox support match id!");
- }
if (req->match_id == resp->match_id) {
resp->resp_status = hns3_resp_to_errno(req->msg[3]);
memcpy(resp->additional_info, &req->msg[4],
@@ -319,11 +256,19 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req)
* support copy request's match_id to its response. So VF follows the
* original scheme to process.
*/
+ msg_data = (uint32_t)req->msg[1] << HNS3_MBX_RESP_CODE_OFFSET | req->msg[2];
+ if (resp->req_msg_data != msg_data) {
+ hns3_warn(hw,
+ "received response tag (%u) is mismatched with requested tag (%u)",
+ msg_data, resp->req_msg_data);
+ return;
+ }
+
resp->resp_status = hns3_resp_to_errno(req->msg[3]);
memcpy(resp->additional_info, &req->msg[4],
HNS3_MBX_MAX_RESP_DATA_SIZE);
- msg_data = (uint32_t)req->msg[1] << 16 | req->msg[2];
- hns3_update_resp_position(hw, msg_data);
+ rte_io_wmb();
+ resp->received_match_resp = true;
}
static void
diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h
index c378783c6c..4a328802b9 100644
--- a/drivers/net/hns3/hns3_mbx.h
+++ b/drivers/net/hns3/hns3_mbx.h
@@ -93,21 +93,11 @@ enum hns3_mbx_link_fail_subcode {
#define HNS3_MBX_MAX_RESP_DATA_SIZE 8
#define HNS3_MBX_DEF_TIME_LIMIT_MS 500
-enum {
- HNS3_MBX_RESP_MATCHING_SCHEME_OF_ORIGINAL = 0,
- HNS3_MBX_RESP_MATCHING_SCHEME_OF_MATCH_ID
-};
-
struct hns3_mbx_resp_status {
rte_spinlock_t lock; /* protects against contending sync cmd resp */
- uint8_t matching_scheme;
-
/* The following fields used in the matching scheme for original */
uint32_t req_msg_data;
- uint32_t head;
- uint32_t tail;
- uint32_t lost;
/* The following fields used in the matching scheme for match_id */
uint16_t match_id;
--
2.23.0