IB/mlx5: Ensure proper synchronization accessing memory
authorEli Cohen <eli@mellanox.com>
Wed, 11 Sep 2013 13:35:36 +0000 (16:35 +0300)
committerRoland Dreier <roland@purestorage.com>
Thu, 10 Oct 2013 16:24:00 +0000 (09:24 -0700)
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>
drivers/infiniband/hw/mlx5/mr.c

index 154241290f5c2a15989f96d22b27efc4940dbf71..3453580b1eb2cc45800b8ee697157a24cf269970 100644 (file)
@@ -680,6 +680,10 @@ static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
                err = -ENOMEM;
                goto error;
        }
+
+       mlx5_ib_populate_pas(dev, umem, page_shift,
+                            mr_align(mr->pas, MLX5_UMR_ALIGN), 1);
+
        mr->dma = dma_map_single(ddev, mr_align(mr->pas, MLX5_UMR_ALIGN), size,
                                 DMA_TO_DEVICE);
        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,
                goto error;
        }
 
-       mlx5_ib_populate_pas(dev, umem, page_shift,
-                            mr_align(mr->pas, MLX5_UMR_ALIGN), 1);
-
        memset(&wr, 0, sizeof(wr));
        wr.wr_id = (u64)(unsigned long)mr;
        prep_umr_reg_wqe(pd, &wr, &sg, mr->dma, npages, mr->mmr.key, page_shift, virt_addr, len, access_flags);