aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKamal Heib <kamalheib1@gmail.com>2019-04-29 07:59:06 -0400
committerJason Gunthorpe <jgg@mellanox.com>2019-05-03 09:56:56 -0400
commitdd05cb828d0ebecd3d772075fccb85ec3618bedf (patch)
treef209a5fe272c5c41638b3ea7bb024193dea441d5
parenteb15c78b05bd9fbac45ee5b56aaf29b2570b5238 (diff)
RDMA: Get rid of iw_cm_verbs
Integrate iw_cm_verbs data members into ib_device_ops and ib_device structs, this is done to achieve the following: 1) Avoid memory related bugs durring error unwind 2) Make the code more cleaner 3) Reduce code duplication Signed-off-by: Kamal Heib <kamalheib1@gmail.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
-rw-r--r--drivers/infiniband/core/device.c8
-rw-r--r--drivers/infiniband/core/iwcm.c35
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_provider.c32
-rw-r--r--drivers/infiniband/hw/cxgb4/provider.c33
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_verbs.c30
-rw-r--r--drivers/infiniband/hw/nes/nes_verbs.c27
-rw-r--r--drivers/infiniband/hw/qedr/main.c25
-rw-r--r--include/rdma/ib_verbs.h23
-rw-r--r--include/rdma/iw_cm.h25
9 files changed, 98 insertions, 140 deletions
diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
index 2123cc693a29..9665c3796cfb 100644
--- a/drivers/infiniband/core/device.c
+++ b/drivers/infiniband/core/device.c
@@ -2370,6 +2370,14 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
2370 SET_DEVICE_OP(dev_ops, get_vf_config); 2370 SET_DEVICE_OP(dev_ops, get_vf_config);
2371 SET_DEVICE_OP(dev_ops, get_vf_stats); 2371 SET_DEVICE_OP(dev_ops, get_vf_stats);
2372 SET_DEVICE_OP(dev_ops, init_port); 2372 SET_DEVICE_OP(dev_ops, init_port);
2373 SET_DEVICE_OP(dev_ops, iw_accept);
2374 SET_DEVICE_OP(dev_ops, iw_add_ref);
2375 SET_DEVICE_OP(dev_ops, iw_connect);
2376 SET_DEVICE_OP(dev_ops, iw_create_listen);
2377 SET_DEVICE_OP(dev_ops, iw_destroy_listen);
2378 SET_DEVICE_OP(dev_ops, iw_get_qp);
2379 SET_DEVICE_OP(dev_ops, iw_reject);
2380 SET_DEVICE_OP(dev_ops, iw_rem_ref);
2373 SET_DEVICE_OP(dev_ops, map_mr_sg); 2381 SET_DEVICE_OP(dev_ops, map_mr_sg);
2374 SET_DEVICE_OP(dev_ops, map_phys_fmr); 2382 SET_DEVICE_OP(dev_ops, map_phys_fmr);
2375 SET_DEVICE_OP(dev_ops, mmap); 2383 SET_DEVICE_OP(dev_ops, mmap);
diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c
index 732637c913d9..72141c5b7c95 100644
--- a/drivers/infiniband/core/iwcm.c
+++ b/drivers/infiniband/core/iwcm.c
@@ -394,7 +394,7 @@ static void destroy_cm_id(struct iw_cm_id *cm_id)
394 cm_id_priv->state = IW_CM_STATE_DESTROYING; 394 cm_id_priv->state = IW_CM_STATE_DESTROYING;
395 spin_unlock_irqrestore(&cm_id_priv->lock, flags); 395 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
396 /* destroy the listening endpoint */ 396 /* destroy the listening endpoint */
397 cm_id->device->iwcm->destroy_listen(cm_id); 397 cm_id->device->ops.iw_destroy_listen(cm_id);
398 spin_lock_irqsave(&cm_id_priv->lock, flags); 398 spin_lock_irqsave(&cm_id_priv->lock, flags);
399 break; 399 break;
400 case IW_CM_STATE_ESTABLISHED: 400 case IW_CM_STATE_ESTABLISHED:
@@ -417,7 +417,7 @@ static void destroy_cm_id(struct iw_cm_id *cm_id)
417 */ 417 */
418 cm_id_priv->state = IW_CM_STATE_DESTROYING; 418 cm_id_priv->state = IW_CM_STATE_DESTROYING;
419 spin_unlock_irqrestore(&cm_id_priv->lock, flags); 419 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
420 cm_id->device->iwcm->reject(cm_id, NULL, 0); 420 cm_id->device->ops.iw_reject(cm_id, NULL, 0);
421 spin_lock_irqsave(&cm_id_priv->lock, flags); 421 spin_lock_irqsave(&cm_id_priv->lock, flags);
422 break; 422 break;
423 case IW_CM_STATE_CONN_SENT: 423 case IW_CM_STATE_CONN_SENT:
@@ -427,7 +427,7 @@ static void destroy_cm_id(struct iw_cm_id *cm_id)
427 break; 427 break;
428 } 428 }
429 if (cm_id_priv->qp) { 429 if (cm_id_priv->qp) {
430 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp); 430 cm_id_priv->id.device->ops.iw_rem_ref(cm_id_priv->qp);
431 cm_id_priv->qp = NULL; 431 cm_id_priv->qp = NULL;
432 } 432 }
433 spin_unlock_irqrestore(&cm_id_priv->lock, flags); 433 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
@@ -504,7 +504,7 @@ static void iw_cm_check_wildcard(struct sockaddr_storage *pm_addr,
504static int iw_cm_map(struct iw_cm_id *cm_id, bool active) 504static int iw_cm_map(struct iw_cm_id *cm_id, bool active)
505{ 505{
506 const char *devname = dev_name(&cm_id->device->dev); 506 const char *devname = dev_name(&cm_id->device->dev);
507 const char *ifname = cm_id->device->iwcm->ifname; 507 const char *ifname = cm_id->device->iw_ifname;
508 struct iwpm_dev_data pm_reg_msg = {}; 508 struct iwpm_dev_data pm_reg_msg = {};
509 struct iwpm_sa_data pm_msg; 509 struct iwpm_sa_data pm_msg;
510 int status; 510 int status;
@@ -526,7 +526,7 @@ static int iw_cm_map(struct iw_cm_id *cm_id, bool active)
526 cm_id->mapped = true; 526 cm_id->mapped = true;
527 pm_msg.loc_addr = cm_id->local_addr; 527 pm_msg.loc_addr = cm_id->local_addr;
528 pm_msg.rem_addr = cm_id->remote_addr; 528 pm_msg.rem_addr = cm_id->remote_addr;
529 pm_msg.flags = (cm_id->device->iwcm->driver_flags & IW_F_NO_PORT_MAP) ? 529 pm_msg.flags = (cm_id->device->iw_driver_flags & IW_F_NO_PORT_MAP) ?
530 IWPM_FLAGS_NO_PORT_MAP : 0; 530 IWPM_FLAGS_NO_PORT_MAP : 0;
531 if (active) 531 if (active)
532 status = iwpm_add_and_query_mapping(&pm_msg, 532 status = iwpm_add_and_query_mapping(&pm_msg,
@@ -577,7 +577,8 @@ int iw_cm_listen(struct iw_cm_id *cm_id, int backlog)
577 spin_unlock_irqrestore(&cm_id_priv->lock, flags); 577 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
578 ret = iw_cm_map(cm_id, false); 578 ret = iw_cm_map(cm_id, false);
579 if (!ret) 579 if (!ret)
580 ret = cm_id->device->iwcm->create_listen(cm_id, backlog); 580 ret = cm_id->device->ops.iw_create_listen(cm_id,
581 backlog);
581 if (ret) 582 if (ret)
582 cm_id_priv->state = IW_CM_STATE_IDLE; 583 cm_id_priv->state = IW_CM_STATE_IDLE;
583 spin_lock_irqsave(&cm_id_priv->lock, flags); 584 spin_lock_irqsave(&cm_id_priv->lock, flags);
@@ -617,7 +618,7 @@ int iw_cm_reject(struct iw_cm_id *cm_id,
617 cm_id_priv->state = IW_CM_STATE_IDLE; 618 cm_id_priv->state = IW_CM_STATE_IDLE;
618 spin_unlock_irqrestore(&cm_id_priv->lock, flags); 619 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
619 620
620 ret = cm_id->device->iwcm->reject(cm_id, private_data, 621 ret = cm_id->device->ops.iw_reject(cm_id, private_data,
621 private_data_len); 622 private_data_len);
622 623
623 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags); 624 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
@@ -653,25 +654,25 @@ int iw_cm_accept(struct iw_cm_id *cm_id,
653 return -EINVAL; 654 return -EINVAL;
654 } 655 }
655 /* Get the ib_qp given the QPN */ 656 /* Get the ib_qp given the QPN */
656 qp = cm_id->device->iwcm->get_qp(cm_id->device, iw_param->qpn); 657 qp = cm_id->device->ops.iw_get_qp(cm_id->device, iw_param->qpn);
657 if (!qp) { 658 if (!qp) {
658 spin_unlock_irqrestore(&cm_id_priv->lock, flags); 659 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
659 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags); 660 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
660 wake_up_all(&cm_id_priv->connect_wait); 661 wake_up_all(&cm_id_priv->connect_wait);
661 return -EINVAL; 662 return -EINVAL;
662 } 663 }
663 cm_id->device->iwcm->add_ref(qp); 664 cm_id->device->ops.iw_add_ref(qp);
664 cm_id_priv->qp = qp; 665 cm_id_priv->qp = qp;
665 spin_unlock_irqrestore(&cm_id_priv->lock, flags); 666 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
666 667
667 ret = cm_id->device->iwcm->accept(cm_id, iw_param); 668 ret = cm_id->device->ops.iw_accept(cm_id, iw_param);
668 if (ret) { 669 if (ret) {
669 /* An error on accept precludes provider events */ 670 /* An error on accept precludes provider events */
670 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_RECV); 671 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_RECV);
671 cm_id_priv->state = IW_CM_STATE_IDLE; 672 cm_id_priv->state = IW_CM_STATE_IDLE;
672 spin_lock_irqsave(&cm_id_priv->lock, flags); 673 spin_lock_irqsave(&cm_id_priv->lock, flags);
673 if (cm_id_priv->qp) { 674 if (cm_id_priv->qp) {
674 cm_id->device->iwcm->rem_ref(qp); 675 cm_id->device->ops.iw_rem_ref(qp);
675 cm_id_priv->qp = NULL; 676 cm_id_priv->qp = NULL;
676 } 677 }
677 spin_unlock_irqrestore(&cm_id_priv->lock, flags); 678 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
@@ -712,25 +713,25 @@ int iw_cm_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param)
712 } 713 }
713 714
714 /* Get the ib_qp given the QPN */ 715 /* Get the ib_qp given the QPN */
715 qp = cm_id->device->iwcm->get_qp(cm_id->device, iw_param->qpn); 716 qp = cm_id->device->ops.iw_get_qp(cm_id->device, iw_param->qpn);
716 if (!qp) { 717 if (!qp) {
717 ret = -EINVAL; 718 ret = -EINVAL;
718 goto err; 719 goto err;
719 } 720 }
720 cm_id->device->iwcm->add_ref(qp); 721 cm_id->device->ops.iw_add_ref(qp);
721 cm_id_priv->qp = qp; 722 cm_id_priv->qp = qp;
722 cm_id_priv->state = IW_CM_STATE_CONN_SENT; 723 cm_id_priv->state = IW_CM_STATE_CONN_SENT;
723 spin_unlock_irqrestore(&cm_id_priv->lock, flags); 724 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
724 725
725 ret = iw_cm_map(cm_id, true); 726 ret = iw_cm_map(cm_id, true);
726 if (!ret) 727 if (!ret)
727 ret = cm_id->device->iwcm->connect(cm_id, iw_param); 728 ret = cm_id->device->ops.iw_connect(cm_id, iw_param);
728 if (!ret) 729 if (!ret)
729 return 0; /* success */ 730 return 0; /* success */
730 731
731 spin_lock_irqsave(&cm_id_priv->lock, flags); 732 spin_lock_irqsave(&cm_id_priv->lock, flags);
732 if (cm_id_priv->qp) { 733 if (cm_id_priv->qp) {
733 cm_id->device->iwcm->rem_ref(qp); 734 cm_id->device->ops.iw_rem_ref(qp);
734 cm_id_priv->qp = NULL; 735 cm_id_priv->qp = NULL;
735 } 736 }
736 cm_id_priv->state = IW_CM_STATE_IDLE; 737 cm_id_priv->state = IW_CM_STATE_IDLE;
@@ -895,7 +896,7 @@ static int cm_conn_rep_handler(struct iwcm_id_private *cm_id_priv,
895 cm_id_priv->state = IW_CM_STATE_ESTABLISHED; 896 cm_id_priv->state = IW_CM_STATE_ESTABLISHED;
896 } else { 897 } else {
897 /* REJECTED or RESET */ 898 /* REJECTED or RESET */
898 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp); 899 cm_id_priv->id.device->ops.iw_rem_ref(cm_id_priv->qp);
899 cm_id_priv->qp = NULL; 900 cm_id_priv->qp = NULL;
900 cm_id_priv->state = IW_CM_STATE_IDLE; 901 cm_id_priv->state = IW_CM_STATE_IDLE;
901 } 902 }
@@ -946,7 +947,7 @@ static int cm_close_handler(struct iwcm_id_private *cm_id_priv,
946 spin_lock_irqsave(&cm_id_priv->lock, flags); 947 spin_lock_irqsave(&cm_id_priv->lock, flags);
947 948
948 if (cm_id_priv->qp) { 949 if (cm_id_priv->qp) {
949 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp); 950 cm_id_priv->id.device->ops.iw_rem_ref(cm_id_priv->qp);
950 cm_id_priv->qp = NULL; 951 cm_id_priv->qp = NULL;
951 } 952 }
952 switch (cm_id_priv->state) { 953 switch (cm_id_priv->state) {
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index 62b99d26f0d3..3a481dfb1607 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -1321,6 +1321,14 @@ static const struct ib_device_ops iwch_dev_ops = {
1321 .get_dma_mr = iwch_get_dma_mr, 1321 .get_dma_mr = iwch_get_dma_mr,
1322 .get_hw_stats = iwch_get_mib, 1322 .get_hw_stats = iwch_get_mib,
1323 .get_port_immutable = iwch_port_immutable, 1323 .get_port_immutable = iwch_port_immutable,
1324 .iw_accept = iwch_accept_cr,
1325 .iw_add_ref = iwch_qp_add_ref,
1326 .iw_connect = iwch_connect,
1327 .iw_create_listen = iwch_create_listen,
1328 .iw_destroy_listen = iwch_destroy_listen,
1329 .iw_get_qp = iwch_get_qp,
1330 .iw_reject = iwch_reject_cr,
1331 .iw_rem_ref = iwch_qp_rem_ref,
1324 .map_mr_sg = iwch_map_mr_sg, 1332 .map_mr_sg = iwch_map_mr_sg,
1325 .mmap = iwch_mmap, 1333 .mmap = iwch_mmap,
1326 .modify_qp = iwch_ib_modify_qp, 1334 .modify_qp = iwch_ib_modify_qp,
@@ -1340,8 +1348,6 @@ static const struct ib_device_ops iwch_dev_ops = {
1340 1348
1341int iwch_register_device(struct iwch_dev *dev) 1349int iwch_register_device(struct iwch_dev *dev)
1342{ 1350{
1343 int ret;
1344
1345 pr_debug("%s iwch_dev %p\n", __func__, dev); 1351 pr_debug("%s iwch_dev %p\n", __func__, dev);
1346 memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid)); 1352 memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid));
1347 memcpy(&dev->ibdev.node_guid, dev->rdev.t3cdev_p->lldev->dev_addr, 6); 1353 memcpy(&dev->ibdev.node_guid, dev->rdev.t3cdev_p->lldev->dev_addr, 6);
@@ -1379,34 +1385,18 @@ int iwch_register_device(struct iwch_dev *dev)
1379 dev->ibdev.dev.parent = &dev->rdev.rnic_info.pdev->dev; 1385 dev->ibdev.dev.parent = &dev->rdev.rnic_info.pdev->dev;
1380 dev->ibdev.uverbs_abi_ver = IWCH_UVERBS_ABI_VERSION; 1386 dev->ibdev.uverbs_abi_ver = IWCH_UVERBS_ABI_VERSION;
1381 1387
1382 dev->ibdev.iwcm = kzalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL); 1388 memcpy(dev->ibdev.iw_ifname, dev->rdev.t3cdev_p->lldev->name,
1383 if (!dev->ibdev.iwcm) 1389 sizeof(dev->ibdev.iw_ifname));
1384 return -ENOMEM;
1385
1386 dev->ibdev.iwcm->connect = iwch_connect;
1387 dev->ibdev.iwcm->accept = iwch_accept_cr;
1388 dev->ibdev.iwcm->reject = iwch_reject_cr;
1389 dev->ibdev.iwcm->create_listen = iwch_create_listen;
1390 dev->ibdev.iwcm->destroy_listen = iwch_destroy_listen;
1391 dev->ibdev.iwcm->add_ref = iwch_qp_add_ref;
1392 dev->ibdev.iwcm->rem_ref = iwch_qp_rem_ref;
1393 dev->ibdev.iwcm->get_qp = iwch_get_qp;
1394 memcpy(dev->ibdev.iwcm->ifname, dev->rdev.t3cdev_p->lldev->name,
1395 sizeof(dev->ibdev.iwcm->ifname));
1396 1390
1397 dev->ibdev.driver_id = RDMA_DRIVER_CXGB3; 1391 dev->ibdev.driver_id = RDMA_DRIVER_CXGB3;
1398 rdma_set_device_sysfs_group(&dev->ibdev, &iwch_attr_group); 1392 rdma_set_device_sysfs_group(&dev->ibdev, &iwch_attr_group);
1399 ib_set_device_ops(&dev->ibdev, &iwch_dev_ops); 1393 ib_set_device_ops(&dev->ibdev, &iwch_dev_ops);
1400 ret = ib_register_device(&dev->ibdev, "cxgb3_%d"); 1394 return ib_register_device(&dev->ibdev, "cxgb3_%d");
1401 if (ret)
1402 kfree(dev->ibdev.iwcm);
1403 return ret;
1404} 1395}
1405 1396
1406void iwch_unregister_device(struct iwch_dev *dev) 1397void iwch_unregister_device(struct iwch_dev *dev)
1407{ 1398{
1408 pr_debug("%s iwch_dev %p\n", __func__, dev); 1399 pr_debug("%s iwch_dev %p\n", __func__, dev);
1409 ib_unregister_device(&dev->ibdev); 1400 ib_unregister_device(&dev->ibdev);
1410 kfree(dev->ibdev.iwcm);
1411 return; 1401 return;
1412} 1402}
diff --git a/drivers/infiniband/hw/cxgb4/provider.c b/drivers/infiniband/hw/cxgb4/provider.c
index 3c5197ee77f5..74b795642fca 100644
--- a/drivers/infiniband/hw/cxgb4/provider.c
+++ b/drivers/infiniband/hw/cxgb4/provider.c
@@ -510,6 +510,14 @@ static const struct ib_device_ops c4iw_dev_ops = {
510 .get_dma_mr = c4iw_get_dma_mr, 510 .get_dma_mr = c4iw_get_dma_mr,
511 .get_hw_stats = c4iw_get_mib, 511 .get_hw_stats = c4iw_get_mib,
512 .get_port_immutable = c4iw_port_immutable, 512 .get_port_immutable = c4iw_port_immutable,
513 .iw_accept = c4iw_accept_cr,
514 .iw_add_ref = c4iw_qp_add_ref,
515 .iw_connect = c4iw_connect,
516 .iw_create_listen = c4iw_create_listen,
517 .iw_destroy_listen = c4iw_destroy_listen,
518 .iw_get_qp = c4iw_get_qp,
519 .iw_reject = c4iw_reject_cr,
520 .iw_rem_ref = c4iw_qp_rem_ref,
513 .map_mr_sg = c4iw_map_mr_sg, 521 .map_mr_sg = c4iw_map_mr_sg,
514 .mmap = c4iw_mmap, 522 .mmap = c4iw_mmap,
515 .modify_qp = c4iw_ib_modify_qp, 523 .modify_qp = c4iw_ib_modify_qp,
@@ -588,36 +596,20 @@ void c4iw_register_device(struct work_struct *work)
588 dev->ibdev.dev.parent = &dev->rdev.lldi.pdev->dev; 596 dev->ibdev.dev.parent = &dev->rdev.lldi.pdev->dev;
589 dev->ibdev.uverbs_abi_ver = C4IW_UVERBS_ABI_VERSION; 597 dev->ibdev.uverbs_abi_ver = C4IW_UVERBS_ABI_VERSION;
590 598
591 dev->ibdev.iwcm = kzalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL); 599 memcpy(dev->ibdev.iw_ifname, dev->rdev.lldi.ports[0]->name,
592 if (!dev->ibdev.iwcm) { 600 sizeof(dev->ibdev.iw_ifname));
593 ret = -ENOMEM;
594 goto err_dealloc_ctx;
595 }
596
597 dev->ibdev.iwcm->connect = c4iw_connect;
598 dev->ibdev.iwcm->accept = c4iw_accept_cr;
599 dev->ibdev.iwcm->reject = c4iw_reject_cr;
600 dev->ibdev.iwcm->create_listen = c4iw_create_listen;
601 dev->ibdev.iwcm->destroy_listen = c4iw_destroy_listen;
602 dev->ibdev.iwcm->add_ref = c4iw_qp_add_ref;
603 dev->ibdev.iwcm->rem_ref = c4iw_qp_rem_ref;
604 dev->ibdev.iwcm->get_qp = c4iw_get_qp;
605 memcpy(dev->ibdev.iwcm->ifname, dev->rdev.lldi.ports[0]->name,
606 sizeof(dev->ibdev.iwcm->ifname));
607 601
608 rdma_set_device_sysfs_group(&dev->ibdev, &c4iw_attr_group); 602 rdma_set_device_sysfs_group(&dev->ibdev, &c4iw_attr_group);
609 dev->ibdev.driver_id = RDMA_DRIVER_CXGB4; 603 dev->ibdev.driver_id = RDMA_DRIVER_CXGB4;
610 ib_set_device_ops(&dev->ibdev, &c4iw_dev_ops); 604 ib_set_device_ops(&dev->ibdev, &c4iw_dev_ops);
611 ret = set_netdevs(&dev->ibdev, &dev->rdev); 605 ret = set_netdevs(&dev->ibdev, &dev->rdev);
612 if (ret) 606 if (ret)
613 goto err_kfree_iwcm; 607 goto err_dealloc_ctx;
614 ret = ib_register_device(&dev->ibdev, "cxgb4_%d"); 608 ret = ib_register_device(&dev->ibdev, "cxgb4_%d");
615 if (ret) 609 if (ret)
616 goto err_kfree_iwcm; 610 goto err_dealloc_ctx;
617 return; 611 return;
618 612
619err_kfree_iwcm:
620 kfree(dev->ibdev.iwcm);
621err_dealloc_ctx: 613err_dealloc_ctx:
622 pr_err("%s - Failed registering iwarp device: %d\n", 614 pr_err("%s - Failed registering iwarp device: %d\n",
623 pci_name(ctx->lldi.pdev), ret); 615 pci_name(ctx->lldi.pdev), ret);
@@ -629,6 +621,5 @@ void c4iw_unregister_device(struct c4iw_dev *dev)
629{ 621{
630 pr_debug("c4iw_dev %p\n", dev); 622 pr_debug("c4iw_dev %p\n", dev);
631 ib_unregister_device(&dev->ibdev); 623 ib_unregister_device(&dev->ibdev);
632 kfree(dev->ibdev.iwcm);
633 return; 624 return;
634} 625}
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
index 7bf7fe854464..b8a1412253ae 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
@@ -2704,6 +2704,14 @@ static const struct ib_device_ops i40iw_dev_ops = {
2704 .get_dma_mr = i40iw_get_dma_mr, 2704 .get_dma_mr = i40iw_get_dma_mr,
2705 .get_hw_stats = i40iw_get_hw_stats, 2705 .get_hw_stats = i40iw_get_hw_stats,
2706 .get_port_immutable = i40iw_port_immutable, 2706 .get_port_immutable = i40iw_port_immutable,
2707 .iw_accept = i40iw_accept,
2708 .iw_add_ref = i40iw_add_ref,
2709 .iw_connect = i40iw_connect,
2710 .iw_create_listen = i40iw_create_listen,
2711 .iw_destroy_listen = i40iw_destroy_listen,
2712 .iw_get_qp = i40iw_get_qp,
2713 .iw_reject = i40iw_reject,
2714 .iw_rem_ref = i40iw_rem_ref,
2707 .map_mr_sg = i40iw_map_mr_sg, 2715 .map_mr_sg = i40iw_map_mr_sg,
2708 .mmap = i40iw_mmap, 2716 .mmap = i40iw_mmap,
2709 .modify_qp = i40iw_modify_qp, 2717 .modify_qp = i40iw_modify_qp,
@@ -2767,22 +2775,8 @@ static struct i40iw_ib_device *i40iw_init_rdma_device(struct i40iw_device *iwdev
2767 iwibdev->ibdev.phys_port_cnt = 1; 2775 iwibdev->ibdev.phys_port_cnt = 1;
2768 iwibdev->ibdev.num_comp_vectors = iwdev->ceqs_count; 2776 iwibdev->ibdev.num_comp_vectors = iwdev->ceqs_count;
2769 iwibdev->ibdev.dev.parent = &pcidev->dev; 2777 iwibdev->ibdev.dev.parent = &pcidev->dev;
2770 iwibdev->ibdev.iwcm = kzalloc(sizeof(*iwibdev->ibdev.iwcm), GFP_KERNEL); 2778 memcpy(iwibdev->ibdev.iw_ifname, netdev->name,
2771 if (!iwibdev->ibdev.iwcm) { 2779 sizeof(iwibdev->ibdev.iw_ifname));
2772 ib_dealloc_device(&iwibdev->ibdev);
2773 return NULL;
2774 }
2775
2776 iwibdev->ibdev.iwcm->add_ref = i40iw_add_ref;
2777 iwibdev->ibdev.iwcm->rem_ref = i40iw_rem_ref;
2778 iwibdev->ibdev.iwcm->get_qp = i40iw_get_qp;
2779 iwibdev->ibdev.iwcm->connect = i40iw_connect;
2780 iwibdev->ibdev.iwcm->accept = i40iw_accept;
2781 iwibdev->ibdev.iwcm->reject = i40iw_reject;
2782 iwibdev->ibdev.iwcm->create_listen = i40iw_create_listen;
2783 iwibdev->ibdev.iwcm->destroy_listen = i40iw_destroy_listen;
2784 memcpy(iwibdev->ibdev.iwcm->ifname, netdev->name,
2785 sizeof(iwibdev->ibdev.iwcm->ifname));
2786 ib_set_device_ops(&iwibdev->ibdev, &i40iw_dev_ops); 2780 ib_set_device_ops(&iwibdev->ibdev, &i40iw_dev_ops);
2787 2781
2788 return iwibdev; 2782 return iwibdev;
@@ -2813,8 +2807,6 @@ void i40iw_destroy_rdma_device(struct i40iw_ib_device *iwibdev)
2813 return; 2807 return;
2814 2808
2815 ib_unregister_device(&iwibdev->ibdev); 2809 ib_unregister_device(&iwibdev->ibdev);
2816 kfree(iwibdev->ibdev.iwcm);
2817 iwibdev->ibdev.iwcm = NULL;
2818 wait_event_timeout(iwibdev->iwdev->close_wq, 2810 wait_event_timeout(iwibdev->iwdev->close_wq,
2819 !atomic64_read(&iwibdev->iwdev->use_count), 2811 !atomic64_read(&iwibdev->iwdev->use_count),
2820 I40IW_EVENT_TIMEOUT); 2812 I40IW_EVENT_TIMEOUT);
@@ -2842,8 +2834,6 @@ int i40iw_register_rdma_device(struct i40iw_device *iwdev)
2842 2834
2843 return 0; 2835 return 0;
2844error: 2836error:
2845 kfree(iwdev->iwibdev->ibdev.iwcm);
2846 iwdev->iwibdev->ibdev.iwcm = NULL;
2847 ib_dealloc_device(&iwdev->iwibdev->ibdev); 2837 ib_dealloc_device(&iwdev->iwibdev->ibdev);
2848 return ret; 2838 return ret;
2849} 2839}
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
index a3b5e8eecb98..49024326a518 100644
--- a/drivers/infiniband/hw/nes/nes_verbs.c
+++ b/drivers/infiniband/hw/nes/nes_verbs.c
@@ -3577,6 +3577,14 @@ static const struct ib_device_ops nes_dev_ops = {
3577 .get_dev_fw_str = get_dev_fw_str, 3577 .get_dev_fw_str = get_dev_fw_str,
3578 .get_dma_mr = nes_get_dma_mr, 3578 .get_dma_mr = nes_get_dma_mr,
3579 .get_port_immutable = nes_port_immutable, 3579 .get_port_immutable = nes_port_immutable,
3580 .iw_accept = nes_accept,
3581 .iw_add_ref = nes_add_ref,
3582 .iw_connect = nes_connect,
3583 .iw_create_listen = nes_create_listen,
3584 .iw_destroy_listen = nes_destroy_listen,
3585 .iw_get_qp = nes_get_qp,
3586 .iw_reject = nes_reject,
3587 .iw_rem_ref = nes_rem_ref,
3580 .map_mr_sg = nes_map_mr_sg, 3588 .map_mr_sg = nes_map_mr_sg,
3581 .mmap = nes_mmap, 3589 .mmap = nes_mmap,
3582 .modify_qp = nes_modify_qp, 3590 .modify_qp = nes_modify_qp,
@@ -3641,23 +3649,9 @@ struct nes_ib_device *nes_init_ofa_device(struct net_device *netdev)
3641 nesibdev->ibdev.num_comp_vectors = 1; 3649 nesibdev->ibdev.num_comp_vectors = 1;
3642 nesibdev->ibdev.dev.parent = &nesdev->pcidev->dev; 3650 nesibdev->ibdev.dev.parent = &nesdev->pcidev->dev;
3643 3651
3644 nesibdev->ibdev.iwcm = kzalloc(sizeof(*nesibdev->ibdev.iwcm), GFP_KERNEL);
3645 if (nesibdev->ibdev.iwcm == NULL) {
3646 ib_dealloc_device(&nesibdev->ibdev);
3647 return NULL;
3648 }
3649 nesibdev->ibdev.iwcm->add_ref = nes_add_ref;
3650 nesibdev->ibdev.iwcm->rem_ref = nes_rem_ref;
3651 nesibdev->ibdev.iwcm->get_qp = nes_get_qp;
3652 nesibdev->ibdev.iwcm->connect = nes_connect;
3653 nesibdev->ibdev.iwcm->accept = nes_accept;
3654 nesibdev->ibdev.iwcm->reject = nes_reject;
3655 nesibdev->ibdev.iwcm->create_listen = nes_create_listen;
3656 nesibdev->ibdev.iwcm->destroy_listen = nes_destroy_listen;
3657
3658 ib_set_device_ops(&nesibdev->ibdev, &nes_dev_ops); 3652 ib_set_device_ops(&nesibdev->ibdev, &nes_dev_ops);
3659 memcpy(nesibdev->ibdev.iwcm->ifname, netdev->name, 3653 memcpy(nesibdev->ibdev.iw_ifname, netdev->name,
3660 sizeof(nesibdev->ibdev.iwcm->ifname)); 3654 sizeof(nesibdev->ibdev.iw_ifname));
3661 3655
3662 return nesibdev; 3656 return nesibdev;
3663} 3657}
@@ -3718,7 +3712,6 @@ void nes_destroy_ofa_device(struct nes_ib_device *nesibdev)
3718 3712
3719 nes_unregister_ofa_device(nesibdev); 3713 nes_unregister_ofa_device(nesibdev);
3720 3714
3721 kfree(nesibdev->ibdev.iwcm);
3722 ib_dealloc_device(&nesibdev->ibdev); 3715 ib_dealloc_device(&nesibdev->ibdev);
3723} 3716}
3724 3717
diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr/main.c
index a0a49ed26860..083c2c00a8e9 100644
--- a/drivers/infiniband/hw/qedr/main.c
+++ b/drivers/infiniband/hw/qedr/main.c
@@ -148,6 +148,14 @@ static const struct attribute_group qedr_attr_group = {
148 148
149static const struct ib_device_ops qedr_iw_dev_ops = { 149static const struct ib_device_ops qedr_iw_dev_ops = {
150 .get_port_immutable = qedr_iw_port_immutable, 150 .get_port_immutable = qedr_iw_port_immutable,
151 .iw_accept = qedr_iw_accept,
152 .iw_add_ref = qedr_iw_qp_add_ref,
153 .iw_connect = qedr_iw_connect,
154 .iw_create_listen = qedr_iw_create_listen,
155 .iw_destroy_listen = qedr_iw_destroy_listen,
156 .iw_get_qp = qedr_iw_get_qp,
157 .iw_reject = qedr_iw_reject,
158 .iw_rem_ref = qedr_iw_qp_rem_ref,
151 .query_gid = qedr_iw_query_gid, 159 .query_gid = qedr_iw_query_gid,
152}; 160};
153 161
@@ -157,21 +165,8 @@ static int qedr_iw_register_device(struct qedr_dev *dev)
157 165
158 ib_set_device_ops(&dev->ibdev, &qedr_iw_dev_ops); 166 ib_set_device_ops(&dev->ibdev, &qedr_iw_dev_ops);
159 167
160 dev->ibdev.iwcm = kzalloc(sizeof(*dev->ibdev.iwcm), GFP_KERNEL); 168 memcpy(dev->ibdev.iw_ifname,
161 if (!dev->ibdev.iwcm) 169 dev->ndev->name, sizeof(dev->ibdev.iw_ifname));
162 return -ENOMEM;
163
164 dev->ibdev.iwcm->connect = qedr_iw_connect;
165 dev->ibdev.iwcm->accept = qedr_iw_accept;
166 dev->ibdev.iwcm->reject = qedr_iw_reject;
167 dev->ibdev.iwcm->create_listen = qedr_iw_create_listen;
168 dev->ibdev.iwcm->destroy_listen = qedr_iw_destroy_listen;
169 dev->ibdev.iwcm->add_ref = qedr_iw_qp_add_ref;
170 dev->ibdev.iwcm->rem_ref = qedr_iw_qp_rem_ref;
171 dev->ibdev.iwcm->get_qp = qedr_iw_get_qp;
172
173 memcpy(dev->ibdev.iwcm->ifname,
174 dev->ndev->name, sizeof(dev->ibdev.iwcm->ifname));
175 170
176 return 0; 171 return 0;
177} 172}
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index de8724e5a727..4312899231ca 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -2221,8 +2221,6 @@ struct ib_cache {
2221 struct ib_event_handler event_handler; 2221 struct ib_event_handler event_handler;
2222}; 2222};
2223 2223
2224struct iw_cm_verbs;
2225
2226struct ib_port_immutable { 2224struct ib_port_immutable {
2227 int pkey_tbl_len; 2225 int pkey_tbl_len;
2228 int gid_tbl_len; 2226 int gid_tbl_len;
@@ -2304,6 +2302,8 @@ struct ib_counters_read_attr {
2304}; 2302};
2305 2303
2306struct uverbs_attr_bundle; 2304struct uverbs_attr_bundle;
2305struct iw_cm_id;
2306struct iw_cm_conn_param;
2307 2307
2308#define INIT_RDMA_OBJ_SIZE(ib_struct, drv_struct, member) \ 2308#define INIT_RDMA_OBJ_SIZE(ib_struct, drv_struct, member) \
2309 .size_##ib_struct = \ 2309 .size_##ib_struct = \
@@ -2581,6 +2581,19 @@ struct ib_device_ops {
2581 */ 2581 */
2582 void (*dealloc_driver)(struct ib_device *dev); 2582 void (*dealloc_driver)(struct ib_device *dev);
2583 2583
2584 /* iWarp CM callbacks */
2585 void (*iw_add_ref)(struct ib_qp *qp);
2586 void (*iw_rem_ref)(struct ib_qp *qp);
2587 struct ib_qp *(*iw_get_qp)(struct ib_device *device, int qpn);
2588 int (*iw_connect)(struct iw_cm_id *cm_id,
2589 struct iw_cm_conn_param *conn_param);
2590 int (*iw_accept)(struct iw_cm_id *cm_id,
2591 struct iw_cm_conn_param *conn_param);
2592 int (*iw_reject)(struct iw_cm_id *cm_id, const void *pdata,
2593 u8 pdata_len);
2594 int (*iw_create_listen)(struct iw_cm_id *cm_id, int backlog);
2595 int (*iw_destroy_listen)(struct iw_cm_id *cm_id);
2596
2584 DECLARE_RDMA_OBJ_SIZE(ib_ah); 2597 DECLARE_RDMA_OBJ_SIZE(ib_ah);
2585 DECLARE_RDMA_OBJ_SIZE(ib_pd); 2598 DECLARE_RDMA_OBJ_SIZE(ib_pd);
2586 DECLARE_RDMA_OBJ_SIZE(ib_srq); 2599 DECLARE_RDMA_OBJ_SIZE(ib_srq);
@@ -2621,8 +2634,6 @@ struct ib_device {
2621 2634
2622 int num_comp_vectors; 2635 int num_comp_vectors;
2623 2636
2624 struct iw_cm_verbs *iwcm;
2625
2626 struct module *owner; 2637 struct module *owner;
2627 union { 2638 union {
2628 struct device dev; 2639 struct device dev;
@@ -2675,6 +2686,10 @@ struct ib_device {
2675 struct mutex compat_devs_mutex; 2686 struct mutex compat_devs_mutex;
2676 /* Maintains compat devices for each net namespace */ 2687 /* Maintains compat devices for each net namespace */
2677 struct xarray compat_devs; 2688 struct xarray compat_devs;
2689
2690 /* Used by iWarp CM */
2691 char iw_ifname[IFNAMSIZ];
2692 u32 iw_driver_flags;
2678}; 2693};
2679 2694
2680struct ib_client { 2695struct ib_client {
diff --git a/include/rdma/iw_cm.h b/include/rdma/iw_cm.h
index 0e1f02815643..5aa8a9c76aa0 100644
--- a/include/rdma/iw_cm.h
+++ b/include/rdma/iw_cm.h
@@ -118,31 +118,6 @@ enum iw_flags {
118 IW_F_NO_PORT_MAP = (1 << 0), 118 IW_F_NO_PORT_MAP = (1 << 0),
119}; 119};
120 120
121struct iw_cm_verbs {
122 void (*add_ref)(struct ib_qp *qp);
123
124 void (*rem_ref)(struct ib_qp *qp);
125
126 struct ib_qp * (*get_qp)(struct ib_device *device,
127 int qpn);
128
129 int (*connect)(struct iw_cm_id *cm_id,
130 struct iw_cm_conn_param *conn_param);
131
132 int (*accept)(struct iw_cm_id *cm_id,
133 struct iw_cm_conn_param *conn_param);
134
135 int (*reject)(struct iw_cm_id *cm_id,
136 const void *pdata, u8 pdata_len);
137
138 int (*create_listen)(struct iw_cm_id *cm_id,
139 int backlog);
140
141 int (*destroy_listen)(struct iw_cm_id *cm_id);
142 char ifname[IFNAMSIZ];
143 enum iw_flags driver_flags;
144};
145
146/** 121/**
147 * iw_create_cm_id - Create an IW CM identifier. 122 * iw_create_cm_id - Create an IW CM identifier.
148 * 123 *