aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/mlx5/mr.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index 06e33e6cb07f..154241290f5c 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -42,6 +42,10 @@ enum {
42 DEF_CACHE_SIZE = 10, 42 DEF_CACHE_SIZE = 10,
43}; 43};
44 44
45enum {
46 MLX5_UMR_ALIGN = 2048
47};
48
45static __be64 *mr_align(__be64 *ptr, int align) 49static __be64 *mr_align(__be64 *ptr, int align)
46{ 50{
47 unsigned long mask = align - 1; 51 unsigned long mask = align - 1;
@@ -671,12 +675,12 @@ static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
671 if (!mr) 675 if (!mr)
672 return ERR_PTR(-EAGAIN); 676 return ERR_PTR(-EAGAIN);
673 677
674 mr->pas = kmalloc(size + 0x3f, GFP_KERNEL); 678 mr->pas = kmalloc(size + MLX5_UMR_ALIGN - 1, GFP_KERNEL);
675 if (!mr->pas) { 679 if (!mr->pas) {
676 err = -ENOMEM; 680 err = -ENOMEM;
677 goto error; 681 goto error;
678 } 682 }
679 mr->dma = dma_map_single(ddev, mr_align(mr->pas, 0x40), size, 683 mr->dma = dma_map_single(ddev, mr_align(mr->pas, MLX5_UMR_ALIGN), size,
680 DMA_TO_DEVICE); 684 DMA_TO_DEVICE);
681 if (dma_mapping_error(ddev, mr->dma)) { 685 if (dma_mapping_error(ddev, mr->dma)) {
682 kfree(mr->pas); 686 kfree(mr->pas);
@@ -684,7 +688,8 @@ static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
684 goto error; 688 goto error;
685 } 689 }
686 690
687 mlx5_ib_populate_pas(dev, umem, page_shift, mr_align(mr->pas, 0x40), 1); 691 mlx5_ib_populate_pas(dev, umem, page_shift,
692 mr_align(mr->pas, MLX5_UMR_ALIGN), 1);
688 693
689 memset(&wr, 0, sizeof(wr)); 694 memset(&wr, 0, sizeof(wr));
690 wr.wr_id = (u64)(unsigned long)mr; 695 wr.wr_id = (u64)(unsigned long)mr;