]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mlx4: Handle memory region deregistration failure
authorShani Michaeli <shanim@mellanox.com>
Sun, 3 Jun 2012 12:48:32 +0000 (15:48 +0300)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 7 Jul 2015 21:45:14 +0000 (14:45 -0700)
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 <haggaie@mellanox.com>
Signed-off-by: Shani Michaeli <shanim@mellanox.com>
(Ported from Mellanox OFED 2.4)

Signed-off-by: Mukesh Kacker <mukesh.kacker@oracle.com>
drivers/infiniband/core/uverbs_main.c
drivers/net/ethernet/mellanox/mlx4/en_main.c
drivers/net/ethernet/mellanox/mlx4/mr.c

index 88cce9bb72fea78a7d03f9c556b394807ca87215..fa93c4e08d885528ef1ea4e98dca8f46aa5441fe 100644 (file)
@@ -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);
        }
 
index 913b716ed2e141189a978af29ab5d54c1b606387..03590daf3c49146d95dc665eeb641a25aa73d7c2 100644 (file)
@@ -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);
index a5c68fb6ccd482ada061e5fabf54eb3a6a8c341c..23e5014f5a690da31053108b7ae2902d963658d6 100644 (file)
@@ -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);