aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorShani Michaeli <shanim@mellanox.com>2013-02-06 11:19:09 -0500
committerRoland Dreier <roland@purestorage.com>2013-02-21 14:38:43 -0500
commit61083720702a329ed5952e32bda384e3bbc9093c (patch)
treee31fb437442c23fdab04f94b69d0c612b870478d /drivers/infiniband
parentb20e519a81d648aebfbb90811743cc86cd469a48 (diff)
mlx4_core: Propagate MR deregistration failures to caller
MR deregistration fails when memory windows are bound to the MR. Handle such failures by propagating them to the caller ULP. Signed-off-by: Haggai Eran <haggaie@mellanox.com> Signed-off-by: Shani Michaeli <shanim@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/mlx4/mr.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/mr.c
index bbaf6176f207..254e1cf26439 100644
--- a/drivers/infiniband/hw/mlx4/mr.c
+++ b/drivers/infiniband/hw/mlx4/mr.c
@@ -68,7 +68,7 @@ struct ib_mr *mlx4_ib_get_dma_mr(struct ib_pd *pd, int acc)
68 return &mr->ibmr; 68 return &mr->ibmr;
69 69
70err_mr: 70err_mr:
71 mlx4_mr_free(to_mdev(pd->device)->dev, &mr->mmr); 71 (void) mlx4_mr_free(to_mdev(pd->device)->dev, &mr->mmr);
72 72
73err_free: 73err_free:
74 kfree(mr); 74 kfree(mr);
@@ -163,7 +163,7 @@ struct ib_mr *mlx4_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
163 return &mr->ibmr; 163 return &mr->ibmr;
164 164
165err_mr: 165err_mr:
166 mlx4_mr_free(to_mdev(pd->device)->dev, &mr->mmr); 166 (void) mlx4_mr_free(to_mdev(pd->device)->dev, &mr->mmr);
167 167
168err_umem: 168err_umem:
169 ib_umem_release(mr->umem); 169 ib_umem_release(mr->umem);
@@ -177,8 +177,11 @@ err_free:
177int mlx4_ib_dereg_mr(struct ib_mr *ibmr) 177int mlx4_ib_dereg_mr(struct ib_mr *ibmr)
178{ 178{
179 struct mlx4_ib_mr *mr = to_mmr(ibmr); 179 struct mlx4_ib_mr *mr = to_mmr(ibmr);
180 int ret;
180 181
181 mlx4_mr_free(to_mdev(ibmr->device)->dev, &mr->mmr); 182 ret = mlx4_mr_free(to_mdev(ibmr->device)->dev, &mr->mmr);
183 if (ret)
184 return ret;
182 if (mr->umem) 185 if (mr->umem)
183 ib_umem_release(mr->umem); 186 ib_umem_release(mr->umem);
184 kfree(mr); 187 kfree(mr);
@@ -212,7 +215,7 @@ struct ib_mr *mlx4_ib_alloc_fast_reg_mr(struct ib_pd *pd,
212 return &mr->ibmr; 215 return &mr->ibmr;
213 216
214err_mr: 217err_mr:
215 mlx4_mr_free(dev->dev, &mr->mmr); 218 (void) mlx4_mr_free(dev->dev, &mr->mmr);
216 219
217err_free: 220err_free:
218 kfree(mr); 221 kfree(mr);
@@ -291,7 +294,7 @@ struct ib_fmr *mlx4_ib_fmr_alloc(struct ib_pd *pd, int acc,
291 return &fmr->ibfmr; 294 return &fmr->ibfmr;
292 295
293err_mr: 296err_mr:
294 mlx4_mr_free(to_mdev(pd->device)->dev, &fmr->mfmr.mr); 297 (void) mlx4_mr_free(to_mdev(pd->device)->dev, &fmr->mfmr.mr);
295 298
296err_free: 299err_free:
297 kfree(fmr); 300 kfree(fmr);