diff options
author | Shani Michaeli <shanim@mellanox.com> | 2013-02-06 11:19:09 -0500 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-02-21 14:38:43 -0500 |
commit | 61083720702a329ed5952e32bda384e3bbc9093c (patch) | |
tree | e31fb437442c23fdab04f94b69d0c612b870478d /drivers/infiniband | |
parent | b20e519a81d648aebfbb90811743cc86cd469a48 (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.c | 13 |
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 | ||
70 | err_mr: | 70 | err_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 | ||
73 | err_free: | 73 | err_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 | ||
165 | err_mr: | 165 | err_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 | ||
168 | err_umem: | 168 | err_umem: |
169 | ib_umem_release(mr->umem); | 169 | ib_umem_release(mr->umem); |
@@ -177,8 +177,11 @@ err_free: | |||
177 | int mlx4_ib_dereg_mr(struct ib_mr *ibmr) | 177 | int 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 | ||
214 | err_mr: | 217 | err_mr: |
215 | mlx4_mr_free(dev->dev, &mr->mmr); | 218 | (void) mlx4_mr_free(dev->dev, &mr->mmr); |
216 | 219 | ||
217 | err_free: | 220 | err_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 | ||
293 | err_mr: | 296 | err_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 | ||
296 | err_free: | 299 | err_free: |
297 | kfree(fmr); | 300 | kfree(fmr); |