Skip to content

Commit

Permalink
hinic: fix out-of-order excution in arm cpu
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Luo bin authored and davem330 committed Mar 22, 2020
1 parent 614eaa9 commit 33f15da
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 0 deletions.
2 changes: 2 additions & 0 deletions drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions drivers/net/ethernet/huawei/hinic/hinic_rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/ethernet/huawei/hinic/hinic_tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) ||
Expand Down

0 comments on commit 33f15da

Please sign in to comment.