lkml.org 
[lkml]   [2020]   [Apr]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 19/32] hinic: fix out-of-order excution in arm cpu
    Date
    From: Luo bin <luobin9@huawei.com>

    [ Upstream commit 33f15da216a1f4566b4ec880942556ace30615df ]

    add read barrier in driver code to keep from reading other fileds
    in dma memory which is writable for hw until we have verified the
    memory is valid for driver

    Signed-off-by: Luo bin <luobin9@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c | 2 ++
    drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c | 2 ++
    drivers/net/ethernet/huawei/hinic/hinic_rx.c | 3 +++
    drivers/net/ethernet/huawei/hinic/hinic_tx.c | 2 ++
    4 files changed, 9 insertions(+)

    diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c b/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c
    index eb53c15b13f33..33f93cc25193a 100644
    --- a/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c
    +++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c
    @@ -623,6 +623,8 @@ static int cmdq_cmd_ceq_handler(struct hinic_cmdq *cmdq, u16 ci,
    if (!CMDQ_WQE_COMPLETED(be32_to_cpu(ctrl->ctrl_info)))
    return -EBUSY;

    + dma_rmb();
    +
    errcode = CMDQ_WQE_ERRCODE_GET(be32_to_cpu(status->status_info), VAL);

    cmdq_sync_cmd_handler(cmdq, ci, errcode);
    diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c b/drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c
    index 6a723c4757bce..c0b6bcb067cd4 100644
    --- a/drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c
    +++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c
    @@ -235,6 +235,8 @@ static void aeq_irq_handler(struct hinic_eq *eq)
    if (HINIC_EQ_ELEM_DESC_GET(aeqe_desc, WRAPPED) == eq->wrapped)
    break;

    + dma_rmb();
    +
    event = HINIC_EQ_ELEM_DESC_GET(aeqe_desc, TYPE);
    if (event >= HINIC_MAX_AEQ_EVENTS) {
    dev_err(&pdev->dev, "Unknown AEQ Event %d\n", event);
    diff --git a/drivers/net/ethernet/huawei/hinic/hinic_rx.c b/drivers/net/ethernet/huawei/hinic/hinic_rx.c
    index 2695ad69fca60..815649e37cb15 100644
    --- a/drivers/net/ethernet/huawei/hinic/hinic_rx.c
    +++ b/drivers/net/ethernet/huawei/hinic/hinic_rx.c
    @@ -350,6 +350,9 @@ static int rxq_recv(struct hinic_rxq *rxq, int budget)
    if (!rq_wqe)
    break;

    + /* make sure we read rx_done before packet length */
    + dma_rmb();
    +
    cqe = rq->cqe[ci];
    status = be32_to_cpu(cqe->status);
    hinic_rq_get_sge(rxq->rq, rq_wqe, ci, &sge);
    diff --git a/drivers/net/ethernet/huawei/hinic/hinic_tx.c b/drivers/net/ethernet/huawei/hinic/hinic_tx.c
    index 0e13d1c7e4746..375d81d03e866 100644
    --- a/drivers/net/ethernet/huawei/hinic/hinic_tx.c
    +++ b/drivers/net/ethernet/huawei/hinic/hinic_tx.c
    @@ -622,6 +622,8 @@ static int free_tx_poll(struct napi_struct *napi, int budget)
    do {
    hw_ci = HW_CONS_IDX(sq) & wq->mask;

    + dma_rmb();
    +
    /* Reading a WQEBB to get real WQE size and consumer index. */
    sq_wqe = hinic_sq_read_wqebb(sq, &skb, &wqe_size, &sw_ci);
    if ((!sq_wqe) ||
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-04-07 02:06    [W:4.205 / U:0.836 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site