lkml.org 
[lkml]   [2019]   [May]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.1 113/405] net: hns3: use atomic_t replace u32 for arqs count
    Date
    [ Upstream commit 30780a8b1677e7409b32ae52a9a84f7d41ae6b43 ]

    Since irq handler and mailbox task will both update arq's count,
    so arq's count should use atomic_t instead of u32, otherwise
    its value may go wrong finally.

    Fixes: 07a0556a3a73 ("net: hns3: Changes to support ARQ(Asynchronous Receive Queue)")
    Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
    Signed-off-by: Peng Li <lipeng321@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h | 2 +-
    drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c | 2 +-
    drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c | 7 ++++---
    3 files changed, 6 insertions(+), 5 deletions(-)

    diff --git a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
    index 299b277bc7ae9..589b7ee32bff8 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
    +++ b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
    @@ -107,7 +107,7 @@ struct hclgevf_mbx_arq_ring {
    struct hclgevf_dev *hdev;
    u32 head;
    u32 tail;
    - u32 count;
    + atomic_t count;
    u16 msg_q[HCLGE_MBX_MAX_ARQ_MSG_NUM][HCLGE_MBX_MAX_ARQ_MSG_SIZE];
    };

    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
    index 9441b453d38df..9a0a501908aec 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
    @@ -327,7 +327,7 @@ int hclgevf_cmd_init(struct hclgevf_dev *hdev)
    hdev->arq.hdev = hdev;
    hdev->arq.head = 0;
    hdev->arq.tail = 0;
    - hdev->arq.count = 0;
    + atomic_set(&hdev->arq.count, 0);
    hdev->hw.cmq.csq.next_to_clean = 0;
    hdev->hw.cmq.csq.next_to_use = 0;
    hdev->hw.cmq.crq.next_to_clean = 0;
    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
    index 7dc3c9f79169f..4f2c77283cb43 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
    @@ -208,7 +208,8 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
    /* we will drop the async msg if we find ARQ as full
    * and continue with next message
    */
    - if (hdev->arq.count >= HCLGE_MBX_MAX_ARQ_MSG_NUM) {
    + if (atomic_read(&hdev->arq.count) >=
    + HCLGE_MBX_MAX_ARQ_MSG_NUM) {
    dev_warn(&hdev->pdev->dev,
    "Async Q full, dropping msg(%d)\n",
    req->msg[1]);
    @@ -220,7 +221,7 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
    memcpy(&msg_q[0], req->msg,
    HCLGE_MBX_MAX_ARQ_MSG_SIZE * sizeof(u16));
    hclge_mbx_tail_ptr_move_arq(hdev->arq);
    - hdev->arq.count++;
    + atomic_inc(&hdev->arq.count);

    hclgevf_mbx_task_schedule(hdev);

    @@ -308,7 +309,7 @@ void hclgevf_mbx_async_handler(struct hclgevf_dev *hdev)
    }

    hclge_mbx_head_ptr_move_arq(hdev->arq);
    - hdev->arq.count--;
    + atomic_dec(&hdev->arq.count);
    msg_q = hdev->arq.msg_q[hdev->arq.head];
    }
    }
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-05-30 06:55    [W:2.280 / U:0.408 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site