aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Wise <swise@opengridcomputing.com>2014-06-20 15:26:25 -0400
committerRoland Dreier <roland@purestorage.com>2014-07-13 13:00:54 -0400
commit46c1376db1b85ae412a7917cec148c6e60f79428 (patch)
treefcc40218a1f7439007a3641842074f55254cd1ac
parent6b54d54dea82ae214e4a45a503c4ef755a8ecee8 (diff)
RDMA/cxgb4: Call iwpm_init() only once
We need to only register with the iwpm core once. Currently it is being done for every adapter, which causes a failure for each adapter but the first, making multiple adapters unusable. Fixes: 9eccfe109b27 ("RDMA/cxgb4: Add support for iWARP Port Mapper user space service") Signed-off-by: Steve Wise <swise@opengridcomputing.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/hw/cxgb4/cm.c2
-rw-r--r--drivers/infiniband/hw/cxgb4/device.c17
-rw-r--r--drivers/infiniband/hw/cxgb4/iw_cxgb4.h2
3 files changed, 12 insertions, 9 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
index 6a93280250d1..768a0fb67dd6 100644
--- a/drivers/infiniband/hw/cxgb4/cm.c
+++ b/drivers/infiniband/hw/cxgb4/cm.c
@@ -3925,7 +3925,7 @@ int __init c4iw_cm_init(void)
3925 return 0; 3925 return 0;
3926} 3926}
3927 3927
3928void __exit c4iw_cm_term(void) 3928void c4iw_cm_term(void)
3929{ 3929{
3930 WARN_ON(!list_empty(&timeout_list)); 3930 WARN_ON(!list_empty(&timeout_list));
3931 flush_workqueue(workq); 3931 flush_workqueue(workq);
diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c
index 16b75de4b2de..7db82b24302b 100644
--- a/drivers/infiniband/hw/cxgb4/device.c
+++ b/drivers/infiniband/hw/cxgb4/device.c
@@ -730,7 +730,6 @@ static void c4iw_dealloc(struct uld_ctx *ctx)
730 if (ctx->dev->rdev.oc_mw_kva) 730 if (ctx->dev->rdev.oc_mw_kva)
731 iounmap(ctx->dev->rdev.oc_mw_kva); 731 iounmap(ctx->dev->rdev.oc_mw_kva);
732 ib_dealloc_device(&ctx->dev->ibdev); 732 ib_dealloc_device(&ctx->dev->ibdev);
733 iwpm_exit(RDMA_NL_C4IW);
734 ctx->dev = NULL; 733 ctx->dev = NULL;
735} 734}
736 735
@@ -827,12 +826,6 @@ static struct c4iw_dev *c4iw_alloc(const struct cxgb4_lld_info *infop)
827 setup_debugfs(devp); 826 setup_debugfs(devp);
828 } 827 }
829 828
830 ret = iwpm_init(RDMA_NL_C4IW);
831 if (ret) {
832 pr_err("port mapper initialization failed with %d\n", ret);
833 ib_dealloc_device(&devp->ibdev);
834 return ERR_PTR(ret);
835 }
836 829
837 return devp; 830 return devp;
838} 831}
@@ -1333,6 +1326,15 @@ static int __init c4iw_init_module(void)
1333 pr_err("%s[%u]: Failed to add netlink callback\n" 1326 pr_err("%s[%u]: Failed to add netlink callback\n"
1334 , __func__, __LINE__); 1327 , __func__, __LINE__);
1335 1328
1329 err = iwpm_init(RDMA_NL_C4IW);
1330 if (err) {
1331 pr_err("port mapper initialization failed with %d\n", err);
1332 ibnl_remove_client(RDMA_NL_C4IW);
1333 c4iw_cm_term();
1334 debugfs_remove_recursive(c4iw_debugfs_root);
1335 return err;
1336 }
1337
1336 cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info); 1338 cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info);
1337 1339
1338 return 0; 1340 return 0;
@@ -1350,6 +1352,7 @@ static void __exit c4iw_exit_module(void)
1350 } 1352 }
1351 mutex_unlock(&dev_mutex); 1353 mutex_unlock(&dev_mutex);
1352 cxgb4_unregister_uld(CXGB4_ULD_RDMA); 1354 cxgb4_unregister_uld(CXGB4_ULD_RDMA);
1355 iwpm_exit(RDMA_NL_C4IW);
1353 ibnl_remove_client(RDMA_NL_C4IW); 1356 ibnl_remove_client(RDMA_NL_C4IW);
1354 c4iw_cm_term(); 1357 c4iw_cm_term();
1355 debugfs_remove_recursive(c4iw_debugfs_root); 1358 debugfs_remove_recursive(c4iw_debugfs_root);
diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
index 125bc5d1e175..361fff7a0742 100644
--- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
+++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
@@ -908,7 +908,7 @@ int c4iw_destroy_ctrl_qp(struct c4iw_rdev *rdev);
908int c4iw_register_device(struct c4iw_dev *dev); 908int c4iw_register_device(struct c4iw_dev *dev);
909void c4iw_unregister_device(struct c4iw_dev *dev); 909void c4iw_unregister_device(struct c4iw_dev *dev);
910int __init c4iw_cm_init(void); 910int __init c4iw_cm_init(void);
911void __exit c4iw_cm_term(void); 911void c4iw_cm_term(void);
912void c4iw_release_dev_ucontext(struct c4iw_rdev *rdev, 912void c4iw_release_dev_ucontext(struct c4iw_rdev *rdev,
913 struct c4iw_dev_ucontext *uctx); 913 struct c4iw_dev_ucontext *uctx);
914void c4iw_init_dev_ucontext(struct c4iw_rdev *rdev, 914void c4iw_init_dev_ucontext(struct c4iw_rdev *rdev,