diff options
author | Kamal Heib <kamalheib1@gmail.com> | 2019-04-29 07:59:06 -0400 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2019-05-03 09:56:56 -0400 |
commit | dd05cb828d0ebecd3d772075fccb85ec3618bedf (patch) | |
tree | f209a5fe272c5c41638b3ea7bb024193dea441d5 | |
parent | eb15c78b05bd9fbac45ee5b56aaf29b2570b5238 (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.c | 8 | ||||
-rw-r--r-- | drivers/infiniband/core/iwcm.c | 35 | ||||
-rw-r--r-- | drivers/infiniband/hw/cxgb3/iwch_provider.c | 32 | ||||
-rw-r--r-- | drivers/infiniband/hw/cxgb4/provider.c | 33 | ||||
-rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_verbs.c | 30 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_verbs.c | 27 | ||||
-rw-r--r-- | drivers/infiniband/hw/qedr/main.c | 25 | ||||
-rw-r--r-- | include/rdma/ib_verbs.h | 23 | ||||
-rw-r--r-- | include/rdma/iw_cm.h | 25 |
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, | |||
504 | static int iw_cm_map(struct iw_cm_id *cm_id, bool active) | 504 | static 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 | ||
1341 | int iwch_register_device(struct iwch_dev *dev) | 1349 | int 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 | ||
1406 | void iwch_unregister_device(struct iwch_dev *dev) | 1397 | void 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 | ||
619 | err_kfree_iwcm: | ||
620 | kfree(dev->ibdev.iwcm); | ||
621 | err_dealloc_ctx: | 613 | err_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; |
2844 | error: | 2836 | error: |
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 | ||
149 | static const struct ib_device_ops qedr_iw_dev_ops = { | 149 | static 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 | ||
2224 | struct iw_cm_verbs; | ||
2225 | |||
2226 | struct ib_port_immutable { | 2224 | struct 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 | ||
2306 | struct uverbs_attr_bundle; | 2304 | struct uverbs_attr_bundle; |
2305 | struct iw_cm_id; | ||
2306 | struct 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 | ||
2680 | struct ib_client { | 2695 | struct 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 | ||
121 | struct 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 | * |