Skip to content

Commit 872599a

Browse files
Shani MichaeliMukesh Kacker
authored andcommitted
mlx4: Handle memory region deregistration failure
Memory region deregistration can fail when memory windows are bound to it. We handle such failures by propagating them to the user, or by printing a serious warning. Signed-off-by: Haggai Eran <[email protected]> Signed-off-by: Shani Michaeli <[email protected]> (Ported from Mellanox OFED 2.4) Signed-off-by: Mukesh Kacker <[email protected]>
1 parent 5f0aa40 commit 872599a

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

drivers/infiniband/core/uverbs_main.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file,
199199
struct ib_ucontext *context)
200200
{
201201
struct ib_uobject *uobj, *tmp;
202+
int err;
202203

203204
if (!context)
204205
return 0;
@@ -273,7 +274,11 @@ static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file,
273274
struct ib_mr *mr = uobj->object;
274275

275276
idr_remove_uobj(&ib_uverbs_mr_idr, uobj);
276-
ib_dereg_mr(mr);
277+
err = ib_dereg_mr(mr);
278+
if (err) {
279+
pr_info("user_verbs: couldn't deregister an MR during cleanup.\n");
280+
pr_info("user_verbs: the system may have become unstable.\n");
281+
}
277282
kfree(uobj);
278283
}
279284

drivers/net/ethernet/mellanox/mlx4/en_main.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ static void mlx4_en_event(struct mlx4_dev *dev, void *endev_ptr,
200200
static void mlx4_en_remove(struct mlx4_dev *dev, void *endev_ptr)
201201
{
202202
struct mlx4_en_dev *mdev = endev_ptr;
203-
int i;
203+
int i, ret;
204204

205205
mutex_lock(&mdev->state_lock);
206206
mdev->device_up = false;
@@ -215,7 +215,9 @@ static void mlx4_en_remove(struct mlx4_dev *dev, void *endev_ptr)
215215

216216
flush_workqueue(mdev->workqueue);
217217
destroy_workqueue(mdev->workqueue);
218-
(void) mlx4_mr_free(dev, &mdev->mr);
218+
ret = mlx4_mr_free(dev, &mdev->mr);
219+
if (ret)
220+
mlx4_err(mdev, "Error deregistering MR. The system may have become unstable.");
219221
iounmap(mdev->uar_map);
220222
mlx4_uar_free(dev, &mdev->priv_uar);
221223
mlx4_pd_free(dev, mdev->priv_pdn);
@@ -315,7 +317,8 @@ static void *mlx4_en_add(struct mlx4_dev *dev)
315317
return mdev;
316318

317319
err_mr:
318-
(void) mlx4_mr_free(dev, &mdev->mr);
320+
if (mlx4_mr_free(dev, &mdev->mr))
321+
mlx4_err(mdev, "Error deregistering MR. The system may have become unstable.");
319322
err_map:
320323
if (mdev->uar_map)
321324
iounmap(mdev->uar_map);

drivers/net/ethernet/mellanox/mlx4/mr.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,7 +1050,7 @@ int mlx4_fmr_alloc(struct mlx4_dev *dev, u32 pd, u32 access, int max_pages,
10501050
int max_maps, u8 page_shift, struct mlx4_fmr *fmr)
10511051
{
10521052
struct mlx4_priv *priv = mlx4_priv(dev);
1053-
int err = -ENOMEM;
1053+
int err = -ENOMEM, ret;
10541054

10551055
if (max_maps > dev->caps.max_fmr_maps)
10561056
return -EINVAL;
@@ -1084,7 +1084,9 @@ int mlx4_fmr_alloc(struct mlx4_dev *dev, u32 pd, u32 access, int max_pages,
10841084
return 0;
10851085

10861086
err_free:
1087-
(void) mlx4_mr_free(dev, &fmr->mr);
1087+
ret = mlx4_mr_free(dev, &fmr->mr);
1088+
if (ret)
1089+
mlx4_err(dev, "Error deregistering MR. The system may have become unstable.");
10881090
return err;
10891091
}
10901092
EXPORT_SYMBOL_GPL(mlx4_fmr_alloc);

0 commit comments

Comments
 (0)