aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Cohen <eli@mellanox.com>2013-09-11 09:35:36 -0400
committerRoland Dreier <roland@purestorage.com>2013-10-10 12:24:00 -0400
commit54313907077ff4cf9a6d82d313afe8ac6cbdaff1 (patch)
tree3a7c05cb5d1a7b221a688ca965f18938a67e3a33
parentfe45f8270436103c305645a6d9d86a9141b9fe09 (diff)
IB/mlx5: Ensure proper synchronization accessing memory
Call mlx5_ib_populate_pas() before mapping the DMA buffer to ensure the hardware reads the values written by the CPU. Found by: Haggai Eran <haggaie@mellanox.com> Signed-off-by: Eli Cohen <eli@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/hw/mlx5/mr.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index 154241290f5c..3453580b1eb2 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -680,6 +680,10 @@ static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
680 err = -ENOMEM; 680 err = -ENOMEM;
681 goto error; 681 goto error;
682 } 682 }
683
684 mlx5_ib_populate_pas(dev, umem, page_shift,
685 mr_align(mr->pas, MLX5_UMR_ALIGN), 1);
686
683 mr->dma = dma_map_single(ddev, mr_align(mr->pas, MLX5_UMR_ALIGN), size, 687 mr->dma = dma_map_single(ddev, mr_align(mr->pas, MLX5_UMR_ALIGN), size,
684 DMA_TO_DEVICE); 688 DMA_TO_DEVICE);
685 if (dma_mapping_error(ddev, mr->dma)) { 689 if (dma_mapping_error(ddev, mr->dma)) {
@@ -688,9 +692,6 @@ static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
688 goto error; 692 goto error;
689 } 693 }
690 694
691 mlx5_ib_populate_pas(dev, umem, page_shift,
692 mr_align(mr->pas, MLX5_UMR_ALIGN), 1);
693
694 memset(&wr, 0, sizeof(wr)); 695 memset(&wr, 0, sizeof(wr));
695 wr.wr_id = (u64)(unsigned long)mr; 696 wr.wr_id = (u64)(unsigned long)mr;
696 prep_umr_reg_wqe(pd, &wr, &sg, mr->dma, npages, mr->mmr.key, page_shift, virt_addr, len, access_flags); 697 prep_umr_reg_wqe(pd, &wr, &sg, mr->dma, npages, mr->mmr.key, page_shift, virt_addr, len, access_flags);