lkml.org 
[lkml]   [2021]   [Jul]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 087/167] net: hns3: fix possible mismatches resp of mailbox
    Date
    From: Chengwen Feng <fengchengwen@huawei.com>

    [ Upstream commit 1b713d14dc3c077ec45e65dab4ea01a8bc41b8c1 ]

    Currently, the mailbox synchronous communication between VF and PF use
    the following fields to maintain communication:
    1. Origin_mbx_msg which was combined by message code and subcode, used
    to match request and response.
    2. Received_resp which means whether received response.

    There may possible mismatches of the following situation:
    1. VF sends message A with code=1 subcode=1.
    2. PF was blocked about 500ms when processing the message A.
    3. VF will detect message A timeout because it can't get the response
    within 500ms.
    4. VF sends message B with code=1 subcode=1 which equal message A.
    5. PF processes the first message A and send the response message to
    VF.
    6. VF will identify the response matched the message B because the
    code/subcode is the same. This will lead to mismatch of request and
    response.

    To fix the above bug, we use the following scheme:
    1. The message sent from VF was labelled with match_id which was a
    unique 16-bit non-zero value.
    2. The response sent from PF will label with match_id which got from
    the request.
    3. The VF uses the match_id to match request and response message.

    As for PF driver, it only needs to copy the match_id from request to
    response.

    Fixes: dde1a86e93ca ("net: hns3: Add mailbox support to PF driver")
    Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
    Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h | 6 ++++--
    drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 1 +
    2 files changed, 5 insertions(+), 2 deletions(-)

    diff --git a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
    index 98a9f5e3fe86..98f55fbe6c3d 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
    +++ b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
    @@ -134,7 +134,8 @@ struct hclge_mbx_vf_to_pf_cmd {
    u8 mbx_need_resp;
    u8 rsv1[1];
    u8 msg_len;
    - u8 rsv2[3];
    + u8 rsv2;
    + u16 match_id;
    struct hclge_vf_to_pf_msg msg;
    };

    @@ -144,7 +145,8 @@ struct hclge_mbx_pf_to_vf_cmd {
    u8 dest_vfid;
    u8 rsv[3];
    u8 msg_len;
    - u8 rsv1[3];
    + u8 rsv1;
    + u16 match_id;
    struct hclge_pf_to_vf_msg msg;
    };

    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
    index 2c2d53f5c56e..61f6f0287cbe 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
    @@ -47,6 +47,7 @@ static int hclge_gen_resp_to_vf(struct hclge_vport *vport,

    resp_pf_to_vf->dest_vfid = vf_to_pf_req->mbx_src_vfid;
    resp_pf_to_vf->msg_len = vf_to_pf_req->msg_len;
    + resp_pf_to_vf->match_id = vf_to_pf_req->match_id;

    resp_pf_to_vf->msg.code = HCLGE_MBX_PF_VF_RESP;
    resp_pf_to_vf->msg.vf_mbx_msg_code = vf_to_pf_req->msg.code;
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-26 18:43    [W:4.150 / U:0.568 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site