From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 10A8043337 for ; Wed, 15 Nov 2023 12:45:42 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0A60D40294; Wed, 15 Nov 2023 12:45:42 +0100 (CET) Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by mails.dpdk.org (Postfix) with ESMTP id DB02040285 for ; Wed, 15 Nov 2023 12:45:40 +0100 (CET) Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-32fb1c35fe0so3882982f8f.1 for ; Wed, 15 Nov 2023 03:45:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1700048740; x=1700653540; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kxv+EG6gD7kcL2lCdR65dWlZZvcJ+bNxZwIGhSvH+Ng=; b=LVtj1YsmZ2eyknwRb78tskRd4/e5Tf7gE8wlTEneyjHkuPpAzjd9KIWHdChYIKsuoV DlrjZHfXH/p47c48YtgdIoTBX8UpxF571TjWgeykc7EStHISOL1hNF4ECy+V3Lhnd4Rj b5UhKDVlL+2wQpNUIxfiJriaLxDmTl1fgalKkfTkB3ozbMpumcQrG33vk923kgBKetwg AWISGi/8wMB8b1DHafYjO53qOzcA/SCEAtk9KdBKA4BnDuZFT3Rtn+m9QspvpGNTwL8o wdswBYD75R+hL8B2wylqMh6zdjGlbRwgqx7sbyS3+/zv5ipGk62JKF4s05RWFvPhIFPm YLuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700048740; x=1700653540; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kxv+EG6gD7kcL2lCdR65dWlZZvcJ+bNxZwIGhSvH+Ng=; b=njN10fpFUrWtGz3tFgvt2AUIZ3Ejf23i7lJ1JwIFxNMfZQhmTmvpzw88umtbhcjYmr dwdOOq2mWUTHqWxwT/8xWA5sMmgmP5aDKn5ploAv4IDwuFH7R9f33/zUMiKLA1dEuN44 80KC+DILSnQ/IQyutNXhWQmBqWD40SV8ac0fzLsGhwM9MnYdyzFKXeh29d61lhK5zFLN /n79RCdMt2aZgM+4QER/sBnEBSkr8G6XNR82fgRbbUuVTUfegE/7ECs+JjJO3+kh1tv7 SG4Z6kLgwAyfKYM9BrZPs21kBE61zty9BXWWyWuPCl5VR6wU+cYJxIx2veT+EI0oz2PI jl5Q== X-Gm-Message-State: AOJu0YyoHZv0Dm8qYaGae7+rlGSbbI7G57ElNQQnb7DrgPfy8k8fqZ5u VzTmKuAeDBZKo+4cbjouxndzOgTZCSQ4Gw== X-Google-Smtp-Source: AGHT+IGCF3VMYUeD62OTR8ehYZgZeYUyt99X9ovA/f4b3WptbJ4q0RqJhNWbCZRj0R+TSocgvlCy1A== X-Received: by 2002:adf:e885:0:b0:32f:acb1:ba9b with SMTP id d5-20020adfe885000000b0032facb1ba9bmr10949486wrm.22.1700048740341; Wed, 15 Nov 2023 03:45:40 -0800 (PST) Received: from localhost ([2a01:4b00:d307:1000:f1d3:eb5e:11f4:a7d9]) by smtp.gmail.com with ESMTPSA id j16-20020a056000125000b0032f983f7306sm10321759wrx.78.2023.11.15.03.45.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Nov 2023 03:45:39 -0800 (PST) From: luca.boccassi@gmail.com To: Dengdui Huang Cc: Jie Hai , Huisong Li , dpdk stable Subject: patch 'net/hns3: fix mailbox sync' has been queued to stable release 20.11.10 Date: Wed, 15 Nov 2023 11:45:07 +0000 Message-Id: <20231115114515.2355140-8-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231115114515.2355140-1-luca.boccassi@gmail.com> References: <20231108192535.922238-37-luca.boccassi@gmail.com> <20231115114515.2355140-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Hi, FYI, your patch has been queued to stable release 20.11.10 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/17/23. 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/b7c87c9536d1cbf2278bee5c92f3d1040d4801d7 Thanks. Luca Boccassi --- >From b7c87c9536d1cbf2278bee5c92f3d1040d4801d7 Mon Sep 17 00:00:00 2001 From: Dengdui Huang Date: Sat, 11 Nov 2023 09:59:14 +0800 Subject: [PATCH] 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") Signed-off-by: Dengdui Huang Signed-off-by: Jie Hai Acked-by: Huisong Li --- 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 eb9590eb17..9e875fc245 100644 --- a/drivers/net/hns3/hns3_cmd.c +++ b/drivers/net/hns3/hns3_cmd.c @@ -565,9 +565,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 63ec11b838..1e2fb63d8d 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) @@ -66,7 +49,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)", @@ -91,20 +73,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 >= HNS3_MAX_RETRY_US) { - 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(); @@ -130,7 +106,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++; @@ -183,7 +158,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); @@ -260,41 +234,10 @@ hns3_mbx_handler(struct hns3_hw *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; @@ -304,12 +247,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], @@ -325,11 +262,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 c61afc2f8e..9ae9822ff5 100644 --- a/drivers/net/hns3/hns3_mbx.h +++ b/drivers/net/hns3/hns3_mbx.h @@ -83,21 +83,11 @@ enum hns3_mbx_link_fail_subcode { #define HNS3_MBX_MAX_MSG_SIZE 16 #define HNS3_MBX_MAX_RESP_DATA_SIZE 8 -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.39.2 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2023-11-15 11:44:13.938018102 +0000 +++ 0008-net-hns3-fix-mailbox-sync.patch 2023-11-15 11:44:13.554387206 +0000 @@ -1 +1 @@ -From be3590f54d0e415c23d4ed6ea55d967139c3ad10 Mon Sep 17 00:00:00 2001 +From b7c87c9536d1cbf2278bee5c92f3d1040d4801d7 Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit be3590f54d0e415c23d4ed6ea55d967139c3ad10 ] + @@ -42 +43,0 @@ -Cc: stable@dpdk.org @@ -54 +55 @@ -index a5c4c11dc8..2c1664485b 100644 +index eb9590eb17..9e875fc245 100644 @@ -57 +58 @@ -@@ -731,9 +731,6 @@ hns3_cmd_init(struct hns3_hw *hw) +@@ -565,9 +565,6 @@ hns3_cmd_init(struct hns3_hw *hw) @@ -68 +69 @@ -index 8e0a58aa02..f1743c195e 100644 +index 63ec11b838..1e2fb63d8d 100644 @@ -95 +96 @@ -@@ -67,7 +50,6 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode, +@@ -66,7 +49,6 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode, @@ -103 +104 @@ -@@ -93,20 +75,14 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode, +@@ -91,20 +73,14 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode, @@ -120 +121 @@ - if (wait_time >= mbx_time_limit) { + if (wait_time >= HNS3_MAX_RETRY_US) { @@ -126 +127 @@ -@@ -132,7 +108,6 @@ hns3_mbx_prepare_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode) +@@ -130,7 +106,6 @@ hns3_mbx_prepare_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode) @@ -134 +135 @@ -@@ -185,7 +160,6 @@ hns3_send_mbx_msg(struct hns3_hw *hw, uint16_t code, uint16_t subcode, +@@ -183,7 +158,6 @@ hns3_send_mbx_msg(struct hns3_hw *hw, uint16_t code, uint16_t subcode, @@ -142,2 +143,2 @@ -@@ -254,41 +228,10 @@ hns3_handle_asserting_reset(struct hns3_hw *hw, - hns3_schedule_reset(HNS3_DEV_HW_TO_ADAPTER(hw)); +@@ -260,41 +234,10 @@ hns3_mbx_handler(struct hns3_hw *hw) + } @@ -185 +186 @@ -@@ -298,12 +241,6 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req) +@@ -304,12 +247,6 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req) @@ -198 +199 @@ -@@ -319,11 +256,19 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req) +@@ -325,11 +262,19 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req) @@ -221 +222 @@ -index c378783c6c..4a328802b9 100644 +index c61afc2f8e..9ae9822ff5 100644 @@ -224 +225,2 @@ -@@ -93,21 +93,11 @@ enum hns3_mbx_link_fail_subcode { +@@ -83,21 +83,11 @@ enum hns3_mbx_link_fail_subcode { + #define HNS3_MBX_MAX_MSG_SIZE 16 @@ -226 +227,0 @@ - #define HNS3_MBX_DEF_TIME_LIMIT_MS 500