diff options
author | Eli Cohen <eli@mellanox.com> | 2013-09-11 09:35:36 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-10-10 12:24:00 -0400 |
commit | 54313907077ff4cf9a6d82d313afe8ac6cbdaff1 (patch) | |
tree | 3a7c05cb5d1a7b221a688ca965f18938a67e3a33 | |
parent | fe45f8270436103c305645a6d9d86a9141b9fe09 (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.c | 7 |
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); |