From 872599a27e03a66fdb6a8d46482a77267667f14f Mon Sep 17 00:00:00 2001 From: Shani Michaeli Date: Sun, 3 Jun 2012 15:48:32 +0300 Subject: [PATCH] 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 Signed-off-by: Shani Michaeli (Ported from Mellanox OFED 2.4) Signed-off-by: Mukesh Kacker --- drivers/infiniband/core/uverbs_main.c | 7 ++++++- drivers/net/ethernet/mellanox/mlx4/en_main.c | 9 ++++++--- drivers/net/ethernet/mellanox/mlx4/mr.c | 6 ++++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index 88cce9bb72fe..fa93c4e08d88 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c @@ -199,6 +199,7 @@ static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file, struct ib_ucontext *context) { struct ib_uobject *uobj, *tmp; + int err; if (!context) return 0; @@ -273,7 +274,11 @@ static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file, struct ib_mr *mr = uobj->object; idr_remove_uobj(&ib_uverbs_mr_idr, uobj); - ib_dereg_mr(mr); + err = ib_dereg_mr(mr); + if (err) { + pr_info("user_verbs: couldn't deregister an MR during cleanup.\n"); + pr_info("user_verbs: the system may have become unstable.\n"); + } kfree(uobj); } diff --git a/drivers/net/ethernet/mellanox/mlx4/en_main.c b/drivers/net/ethernet/mellanox/mlx4/en_main.c index 913b716ed2e1..03590daf3c49 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_main.c @@ -200,7 +200,7 @@ static void mlx4_en_event(struct mlx4_dev *dev, void *endev_ptr, static void mlx4_en_remove(struct mlx4_dev *dev, void *endev_ptr) { struct mlx4_en_dev *mdev = endev_ptr; - int i; + int i, ret; mutex_lock(&mdev->state_lock); mdev->device_up = false; @@ -215,7 +215,9 @@ static void mlx4_en_remove(struct mlx4_dev *dev, void *endev_ptr) flush_workqueue(mdev->workqueue); destroy_workqueue(mdev->workqueue); - (void) mlx4_mr_free(dev, &mdev->mr); + ret = mlx4_mr_free(dev, &mdev->mr); + if (ret) + mlx4_err(mdev, "Error deregistering MR. The system may have become unstable."); iounmap(mdev->uar_map); mlx4_uar_free(dev, &mdev->priv_uar); mlx4_pd_free(dev, mdev->priv_pdn); @@ -315,7 +317,8 @@ static void *mlx4_en_add(struct mlx4_dev *dev) return mdev; err_mr: - (void) mlx4_mr_free(dev, &mdev->mr); + if (mlx4_mr_free(dev, &mdev->mr)) + mlx4_err(mdev, "Error deregistering MR. The system may have become unstable."); err_map: if (mdev->uar_map) iounmap(mdev->uar_map); diff --git a/drivers/net/ethernet/mellanox/mlx4/mr.c b/drivers/net/ethernet/mellanox/mlx4/mr.c index a5c68fb6ccd4..23e5014f5a69 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mr.c +++ b/drivers/net/ethernet/mellanox/mlx4/mr.c @@ -1050,7 +1050,7 @@ int mlx4_fmr_alloc(struct mlx4_dev *dev, u32 pd, u32 access, int max_pages, int max_maps, u8 page_shift, struct mlx4_fmr *fmr) { struct mlx4_priv *priv = mlx4_priv(dev); - int err = -ENOMEM; + int err = -ENOMEM, ret; if (max_maps > dev->caps.max_fmr_maps) return -EINVAL; @@ -1084,7 +1084,9 @@ int mlx4_fmr_alloc(struct mlx4_dev *dev, u32 pd, u32 access, int max_pages, return 0; err_free: - (void) mlx4_mr_free(dev, &fmr->mr); + ret = mlx4_mr_free(dev, &fmr->mr); + if (ret) + mlx4_err(dev, "Error deregistering MR. The system may have become unstable."); return err; } EXPORT_SYMBOL_GPL(mlx4_fmr_alloc); -- 2.50.1