diff options
author | Eli Cohen <eli@mellanox.com> | 2013-09-11 09:35:35 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-10-10 12:23:59 -0400 |
commit | fe45f8270436103c305645a6d9d86a9141b9fe09 (patch) | |
tree | cd3a565281ef5a66c5e8fd78e171d154f37d5e24 | |
parent | ada9f5d007971a71d619e2abf66ebd3a9a399413 (diff) |
IB/mlx5: Fix alignment of reg umr gather buffers
The hardware requires that gather buffers for UMR work requests be
aligned to 2K.
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 | 11 |
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 | ||
45 | enum { | ||
46 | MLX5_UMR_ALIGN = 2048 | ||
47 | }; | ||
48 | |||
45 | static __be64 *mr_align(__be64 *ptr, int align) | 49 | static __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; |