aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/mlx5/mr.c57
1 files changed, 22 insertions, 35 deletions
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index e86dbbdb3836..06e33e6cb07f 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -61,13 +61,11 @@ static int order2idx(struct mlx5_ib_dev *dev, int order)
61 61
62static int add_keys(struct mlx5_ib_dev *dev, int c, int num) 62static int add_keys(struct mlx5_ib_dev *dev, int c, int num)
63{ 63{
64 struct device *ddev = dev->ib_dev.dma_device;
65 struct mlx5_mr_cache *cache = &dev->cache; 64 struct mlx5_mr_cache *cache = &dev->cache;
66 struct mlx5_cache_ent *ent = &cache->ent[c]; 65 struct mlx5_cache_ent *ent = &cache->ent[c];
67 struct mlx5_create_mkey_mbox_in *in; 66 struct mlx5_create_mkey_mbox_in *in;
68 struct mlx5_ib_mr *mr; 67 struct mlx5_ib_mr *mr;
69 int npages = 1 << ent->order; 68 int npages = 1 << ent->order;
70 int size = sizeof(u64) * npages;
71 int err = 0; 69 int err = 0;
72 int i; 70 int i;
73 71
@@ -83,21 +81,6 @@ static int add_keys(struct mlx5_ib_dev *dev, int c, int num)
83 } 81 }
84 mr->order = ent->order; 82 mr->order = ent->order;
85 mr->umred = 1; 83 mr->umred = 1;
86 mr->pas = kmalloc(size + 0x3f, GFP_KERNEL);
87 if (!mr->pas) {
88 kfree(mr);
89 err = -ENOMEM;
90 goto out;
91 }
92 mr->dma = dma_map_single(ddev, mr_align(mr->pas, 0x40), size,
93 DMA_TO_DEVICE);
94 if (dma_mapping_error(ddev, mr->dma)) {
95 kfree(mr->pas);
96 kfree(mr);
97 err = -ENOMEM;
98 goto out;
99 }
100
101 in->seg.status = 1 << 6; 84 in->seg.status = 1 << 6;
102 in->seg.xlt_oct_size = cpu_to_be32((npages + 1) / 2); 85 in->seg.xlt_oct_size = cpu_to_be32((npages + 1) / 2);
103 in->seg.qpn_mkey7_0 = cpu_to_be32(0xffffff << 8); 86 in->seg.qpn_mkey7_0 = cpu_to_be32(0xffffff << 8);
@@ -108,8 +91,6 @@ static int add_keys(struct mlx5_ib_dev *dev, int c, int num)
108 sizeof(*in)); 91 sizeof(*in));
109 if (err) { 92 if (err) {
110 mlx5_ib_warn(dev, "create mkey failed %d\n", err); 93 mlx5_ib_warn(dev, "create mkey failed %d\n", err);
111 dma_unmap_single(ddev, mr->dma, size, DMA_TO_DEVICE);
112 kfree(mr->pas);
113 kfree(mr); 94 kfree(mr);
114 goto out; 95 goto out;
115 } 96 }
@@ -129,11 +110,9 @@ out:
129 110
130static void remove_keys(struct mlx5_ib_dev *dev, int c, int num) 111static void remove_keys(struct mlx5_ib_dev *dev, int c, int num)
131{ 112{
132 struct device *ddev = dev->ib_dev.dma_device;
133 struct mlx5_mr_cache *cache = &dev->cache; 113 struct mlx5_mr_cache *cache = &dev->cache;
134 struct mlx5_cache_ent *ent = &cache->ent[c]; 114 struct mlx5_cache_ent *ent = &cache->ent[c];
135 struct mlx5_ib_mr *mr; 115 struct mlx5_ib_mr *mr;
136 int size;
137 int err; 116 int err;
138 int i; 117 int i;
139 118
@@ -149,14 +128,10 @@ static void remove_keys(struct mlx5_ib_dev *dev, int c, int num)
149 ent->size--; 128 ent->size--;
150 spin_unlock(&ent->lock); 129 spin_unlock(&ent->lock);
151 err = mlx5_core_destroy_mkey(&dev->mdev, &mr->mmr); 130 err = mlx5_core_destroy_mkey(&dev->mdev, &mr->mmr);
152 if (err) { 131 if (err)
153 mlx5_ib_warn(dev, "failed destroy mkey\n"); 132 mlx5_ib_warn(dev, "failed destroy mkey\n");
154 } else { 133 else
155 size = ALIGN(sizeof(u64) * (1 << mr->order), 0x40);
156 dma_unmap_single(ddev, mr->dma, size, DMA_TO_DEVICE);
157 kfree(mr->pas);
158 kfree(mr); 134 kfree(mr);
159 }
160 } 135 }
161} 136}
162 137
@@ -408,11 +383,9 @@ static void free_cached_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
408 383
409static void clean_keys(struct mlx5_ib_dev *dev, int c) 384static void clean_keys(struct mlx5_ib_dev *dev, int c)
410{ 385{
411 struct device *ddev = dev->ib_dev.dma_device;
412 struct mlx5_mr_cache *cache = &dev->cache; 386 struct mlx5_mr_cache *cache = &dev->cache;
413 struct mlx5_cache_ent *ent = &cache->ent[c]; 387 struct mlx5_cache_ent *ent = &cache->ent[c];
414 struct mlx5_ib_mr *mr; 388 struct mlx5_ib_mr *mr;
415 int size;
416 int err; 389 int err;
417 390
418 cancel_delayed_work(&ent->dwork); 391 cancel_delayed_work(&ent->dwork);
@@ -428,14 +401,10 @@ static void clean_keys(struct mlx5_ib_dev *dev, int c)
428 ent->size--; 401 ent->size--;
429 spin_unlock(&ent->lock); 402 spin_unlock(&ent->lock);
430 err = mlx5_core_destroy_mkey(&dev->mdev, &mr->mmr); 403 err = mlx5_core_destroy_mkey(&dev->mdev, &mr->mmr);
431 if (err) { 404 if (err)
432 mlx5_ib_warn(dev, "failed destroy mkey\n"); 405 mlx5_ib_warn(dev, "failed destroy mkey\n");
433 } else { 406 else
434 size = ALIGN(sizeof(u64) * (1 << mr->order), 0x40);
435 dma_unmap_single(ddev, mr->dma, size, DMA_TO_DEVICE);
436 kfree(mr->pas);
437 kfree(mr); 407 kfree(mr);
438 }
439 } 408 }
440} 409}
441 410
@@ -678,10 +647,12 @@ static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
678 int page_shift, int order, int access_flags) 647 int page_shift, int order, int access_flags)
679{ 648{
680 struct mlx5_ib_dev *dev = to_mdev(pd->device); 649 struct mlx5_ib_dev *dev = to_mdev(pd->device);
650 struct device *ddev = dev->ib_dev.dma_device;
681 struct umr_common *umrc = &dev->umrc; 651 struct umr_common *umrc = &dev->umrc;
682 struct ib_send_wr wr, *bad; 652 struct ib_send_wr wr, *bad;
683 struct mlx5_ib_mr *mr; 653 struct mlx5_ib_mr *mr;
684 struct ib_sge sg; 654 struct ib_sge sg;
655 int size = sizeof(u64) * npages;
685 int err; 656 int err;
686 int i; 657 int i;
687 658
@@ -700,6 +671,19 @@ static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
700 if (!mr) 671 if (!mr)
701 return ERR_PTR(-EAGAIN); 672 return ERR_PTR(-EAGAIN);
702 673
674 mr->pas = kmalloc(size + 0x3f, GFP_KERNEL);
675 if (!mr->pas) {
676 err = -ENOMEM;
677 goto error;
678 }
679 mr->dma = dma_map_single(ddev, mr_align(mr->pas, 0x40), size,
680 DMA_TO_DEVICE);
681 if (dma_mapping_error(ddev, mr->dma)) {
682 kfree(mr->pas);
683 err = -ENOMEM;
684 goto error;
685 }
686
703 mlx5_ib_populate_pas(dev, umem, page_shift, mr_align(mr->pas, 0x40), 1); 687 mlx5_ib_populate_pas(dev, umem, page_shift, mr_align(mr->pas, 0x40), 1);
704 688
705 memset(&wr, 0, sizeof(wr)); 689 memset(&wr, 0, sizeof(wr));
@@ -721,6 +705,9 @@ static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
721 wait_for_completion(&mr->done); 705 wait_for_completion(&mr->done);
722 up(&umrc->sem); 706 up(&umrc->sem);
723 707
708 dma_unmap_single(ddev, mr->dma, size, DMA_TO_DEVICE);
709 kfree(mr->pas);
710
724 if (mr->status != IB_WC_SUCCESS) { 711 if (mr->status != IB_WC_SUCCESS) {
725 mlx5_ib_warn(dev, "reg umr failed\n"); 712 mlx5_ib_warn(dev, "reg umr failed\n");
726 err = -EFAULT; 713 err = -EFAULT;