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>
This commit is contained in:

zatwierdzone przez
Jason Gunthorpe

rodzic
eb15c78b05
commit
dd05cb828d
@@ -1321,6 +1321,14 @@ static const struct ib_device_ops iwch_dev_ops = {
|
||||
.get_dma_mr = iwch_get_dma_mr,
|
||||
.get_hw_stats = iwch_get_mib,
|
||||
.get_port_immutable = iwch_port_immutable,
|
||||
.iw_accept = iwch_accept_cr,
|
||||
.iw_add_ref = iwch_qp_add_ref,
|
||||
.iw_connect = iwch_connect,
|
||||
.iw_create_listen = iwch_create_listen,
|
||||
.iw_destroy_listen = iwch_destroy_listen,
|
||||
.iw_get_qp = iwch_get_qp,
|
||||
.iw_reject = iwch_reject_cr,
|
||||
.iw_rem_ref = iwch_qp_rem_ref,
|
||||
.map_mr_sg = iwch_map_mr_sg,
|
||||
.mmap = iwch_mmap,
|
||||
.modify_qp = iwch_ib_modify_qp,
|
||||
@@ -1340,8 +1348,6 @@ static const struct ib_device_ops iwch_dev_ops = {
|
||||
|
||||
int iwch_register_device(struct iwch_dev *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
pr_debug("%s iwch_dev %p\n", __func__, dev);
|
||||
memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid));
|
||||
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)
|
||||
dev->ibdev.dev.parent = &dev->rdev.rnic_info.pdev->dev;
|
||||
dev->ibdev.uverbs_abi_ver = IWCH_UVERBS_ABI_VERSION;
|
||||
|
||||
dev->ibdev.iwcm = kzalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL);
|
||||
if (!dev->ibdev.iwcm)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->ibdev.iwcm->connect = iwch_connect;
|
||||
dev->ibdev.iwcm->accept = iwch_accept_cr;
|
||||
dev->ibdev.iwcm->reject = iwch_reject_cr;
|
||||
dev->ibdev.iwcm->create_listen = iwch_create_listen;
|
||||
dev->ibdev.iwcm->destroy_listen = iwch_destroy_listen;
|
||||
dev->ibdev.iwcm->add_ref = iwch_qp_add_ref;
|
||||
dev->ibdev.iwcm->rem_ref = iwch_qp_rem_ref;
|
||||
dev->ibdev.iwcm->get_qp = iwch_get_qp;
|
||||
memcpy(dev->ibdev.iwcm->ifname, dev->rdev.t3cdev_p->lldev->name,
|
||||
sizeof(dev->ibdev.iwcm->ifname));
|
||||
memcpy(dev->ibdev.iw_ifname, dev->rdev.t3cdev_p->lldev->name,
|
||||
sizeof(dev->ibdev.iw_ifname));
|
||||
|
||||
dev->ibdev.driver_id = RDMA_DRIVER_CXGB3;
|
||||
rdma_set_device_sysfs_group(&dev->ibdev, &iwch_attr_group);
|
||||
ib_set_device_ops(&dev->ibdev, &iwch_dev_ops);
|
||||
ret = ib_register_device(&dev->ibdev, "cxgb3_%d");
|
||||
if (ret)
|
||||
kfree(dev->ibdev.iwcm);
|
||||
return ret;
|
||||
return ib_register_device(&dev->ibdev, "cxgb3_%d");
|
||||
}
|
||||
|
||||
void iwch_unregister_device(struct iwch_dev *dev)
|
||||
{
|
||||
pr_debug("%s iwch_dev %p\n", __func__, dev);
|
||||
ib_unregister_device(&dev->ibdev);
|
||||
kfree(dev->ibdev.iwcm);
|
||||
return;
|
||||
}
|
||||
|
@@ -510,6 +510,14 @@ static const struct ib_device_ops c4iw_dev_ops = {
|
||||
.get_dma_mr = c4iw_get_dma_mr,
|
||||
.get_hw_stats = c4iw_get_mib,
|
||||
.get_port_immutable = c4iw_port_immutable,
|
||||
.iw_accept = c4iw_accept_cr,
|
||||
.iw_add_ref = c4iw_qp_add_ref,
|
||||
.iw_connect = c4iw_connect,
|
||||
.iw_create_listen = c4iw_create_listen,
|
||||
.iw_destroy_listen = c4iw_destroy_listen,
|
||||
.iw_get_qp = c4iw_get_qp,
|
||||
.iw_reject = c4iw_reject_cr,
|
||||
.iw_rem_ref = c4iw_qp_rem_ref,
|
||||
.map_mr_sg = c4iw_map_mr_sg,
|
||||
.mmap = c4iw_mmap,
|
||||
.modify_qp = c4iw_ib_modify_qp,
|
||||
@@ -588,36 +596,20 @@ void c4iw_register_device(struct work_struct *work)
|
||||
dev->ibdev.dev.parent = &dev->rdev.lldi.pdev->dev;
|
||||
dev->ibdev.uverbs_abi_ver = C4IW_UVERBS_ABI_VERSION;
|
||||
|
||||
dev->ibdev.iwcm = kzalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL);
|
||||
if (!dev->ibdev.iwcm) {
|
||||
ret = -ENOMEM;
|
||||
goto err_dealloc_ctx;
|
||||
}
|
||||
|
||||
dev->ibdev.iwcm->connect = c4iw_connect;
|
||||
dev->ibdev.iwcm->accept = c4iw_accept_cr;
|
||||
dev->ibdev.iwcm->reject = c4iw_reject_cr;
|
||||
dev->ibdev.iwcm->create_listen = c4iw_create_listen;
|
||||
dev->ibdev.iwcm->destroy_listen = c4iw_destroy_listen;
|
||||
dev->ibdev.iwcm->add_ref = c4iw_qp_add_ref;
|
||||
dev->ibdev.iwcm->rem_ref = c4iw_qp_rem_ref;
|
||||
dev->ibdev.iwcm->get_qp = c4iw_get_qp;
|
||||
memcpy(dev->ibdev.iwcm->ifname, dev->rdev.lldi.ports[0]->name,
|
||||
sizeof(dev->ibdev.iwcm->ifname));
|
||||
memcpy(dev->ibdev.iw_ifname, dev->rdev.lldi.ports[0]->name,
|
||||
sizeof(dev->ibdev.iw_ifname));
|
||||
|
||||
rdma_set_device_sysfs_group(&dev->ibdev, &c4iw_attr_group);
|
||||
dev->ibdev.driver_id = RDMA_DRIVER_CXGB4;
|
||||
ib_set_device_ops(&dev->ibdev, &c4iw_dev_ops);
|
||||
ret = set_netdevs(&dev->ibdev, &dev->rdev);
|
||||
if (ret)
|
||||
goto err_kfree_iwcm;
|
||||
goto err_dealloc_ctx;
|
||||
ret = ib_register_device(&dev->ibdev, "cxgb4_%d");
|
||||
if (ret)
|
||||
goto err_kfree_iwcm;
|
||||
goto err_dealloc_ctx;
|
||||
return;
|
||||
|
||||
err_kfree_iwcm:
|
||||
kfree(dev->ibdev.iwcm);
|
||||
err_dealloc_ctx:
|
||||
pr_err("%s - Failed registering iwarp device: %d\n",
|
||||
pci_name(ctx->lldi.pdev), ret);
|
||||
@@ -629,6 +621,5 @@ void c4iw_unregister_device(struct c4iw_dev *dev)
|
||||
{
|
||||
pr_debug("c4iw_dev %p\n", dev);
|
||||
ib_unregister_device(&dev->ibdev);
|
||||
kfree(dev->ibdev.iwcm);
|
||||
return;
|
||||
}
|
||||
|
@@ -2704,6 +2704,14 @@ static const struct ib_device_ops i40iw_dev_ops = {
|
||||
.get_dma_mr = i40iw_get_dma_mr,
|
||||
.get_hw_stats = i40iw_get_hw_stats,
|
||||
.get_port_immutable = i40iw_port_immutable,
|
||||
.iw_accept = i40iw_accept,
|
||||
.iw_add_ref = i40iw_add_ref,
|
||||
.iw_connect = i40iw_connect,
|
||||
.iw_create_listen = i40iw_create_listen,
|
||||
.iw_destroy_listen = i40iw_destroy_listen,
|
||||
.iw_get_qp = i40iw_get_qp,
|
||||
.iw_reject = i40iw_reject,
|
||||
.iw_rem_ref = i40iw_rem_ref,
|
||||
.map_mr_sg = i40iw_map_mr_sg,
|
||||
.mmap = i40iw_mmap,
|
||||
.modify_qp = i40iw_modify_qp,
|
||||
@@ -2767,22 +2775,8 @@ static struct i40iw_ib_device *i40iw_init_rdma_device(struct i40iw_device *iwdev
|
||||
iwibdev->ibdev.phys_port_cnt = 1;
|
||||
iwibdev->ibdev.num_comp_vectors = iwdev->ceqs_count;
|
||||
iwibdev->ibdev.dev.parent = &pcidev->dev;
|
||||
iwibdev->ibdev.iwcm = kzalloc(sizeof(*iwibdev->ibdev.iwcm), GFP_KERNEL);
|
||||
if (!iwibdev->ibdev.iwcm) {
|
||||
ib_dealloc_device(&iwibdev->ibdev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
iwibdev->ibdev.iwcm->add_ref = i40iw_add_ref;
|
||||
iwibdev->ibdev.iwcm->rem_ref = i40iw_rem_ref;
|
||||
iwibdev->ibdev.iwcm->get_qp = i40iw_get_qp;
|
||||
iwibdev->ibdev.iwcm->connect = i40iw_connect;
|
||||
iwibdev->ibdev.iwcm->accept = i40iw_accept;
|
||||
iwibdev->ibdev.iwcm->reject = i40iw_reject;
|
||||
iwibdev->ibdev.iwcm->create_listen = i40iw_create_listen;
|
||||
iwibdev->ibdev.iwcm->destroy_listen = i40iw_destroy_listen;
|
||||
memcpy(iwibdev->ibdev.iwcm->ifname, netdev->name,
|
||||
sizeof(iwibdev->ibdev.iwcm->ifname));
|
||||
memcpy(iwibdev->ibdev.iw_ifname, netdev->name,
|
||||
sizeof(iwibdev->ibdev.iw_ifname));
|
||||
ib_set_device_ops(&iwibdev->ibdev, &i40iw_dev_ops);
|
||||
|
||||
return iwibdev;
|
||||
@@ -2813,8 +2807,6 @@ void i40iw_destroy_rdma_device(struct i40iw_ib_device *iwibdev)
|
||||
return;
|
||||
|
||||
ib_unregister_device(&iwibdev->ibdev);
|
||||
kfree(iwibdev->ibdev.iwcm);
|
||||
iwibdev->ibdev.iwcm = NULL;
|
||||
wait_event_timeout(iwibdev->iwdev->close_wq,
|
||||
!atomic64_read(&iwibdev->iwdev->use_count),
|
||||
I40IW_EVENT_TIMEOUT);
|
||||
@@ -2842,8 +2834,6 @@ int i40iw_register_rdma_device(struct i40iw_device *iwdev)
|
||||
|
||||
return 0;
|
||||
error:
|
||||
kfree(iwdev->iwibdev->ibdev.iwcm);
|
||||
iwdev->iwibdev->ibdev.iwcm = NULL;
|
||||
ib_dealloc_device(&iwdev->iwibdev->ibdev);
|
||||
return ret;
|
||||
}
|
||||
|
@@ -3577,6 +3577,14 @@ static const struct ib_device_ops nes_dev_ops = {
|
||||
.get_dev_fw_str = get_dev_fw_str,
|
||||
.get_dma_mr = nes_get_dma_mr,
|
||||
.get_port_immutable = nes_port_immutable,
|
||||
.iw_accept = nes_accept,
|
||||
.iw_add_ref = nes_add_ref,
|
||||
.iw_connect = nes_connect,
|
||||
.iw_create_listen = nes_create_listen,
|
||||
.iw_destroy_listen = nes_destroy_listen,
|
||||
.iw_get_qp = nes_get_qp,
|
||||
.iw_reject = nes_reject,
|
||||
.iw_rem_ref = nes_rem_ref,
|
||||
.map_mr_sg = nes_map_mr_sg,
|
||||
.mmap = nes_mmap,
|
||||
.modify_qp = nes_modify_qp,
|
||||
@@ -3641,23 +3649,9 @@ struct nes_ib_device *nes_init_ofa_device(struct net_device *netdev)
|
||||
nesibdev->ibdev.num_comp_vectors = 1;
|
||||
nesibdev->ibdev.dev.parent = &nesdev->pcidev->dev;
|
||||
|
||||
nesibdev->ibdev.iwcm = kzalloc(sizeof(*nesibdev->ibdev.iwcm), GFP_KERNEL);
|
||||
if (nesibdev->ibdev.iwcm == NULL) {
|
||||
ib_dealloc_device(&nesibdev->ibdev);
|
||||
return NULL;
|
||||
}
|
||||
nesibdev->ibdev.iwcm->add_ref = nes_add_ref;
|
||||
nesibdev->ibdev.iwcm->rem_ref = nes_rem_ref;
|
||||
nesibdev->ibdev.iwcm->get_qp = nes_get_qp;
|
||||
nesibdev->ibdev.iwcm->connect = nes_connect;
|
||||
nesibdev->ibdev.iwcm->accept = nes_accept;
|
||||
nesibdev->ibdev.iwcm->reject = nes_reject;
|
||||
nesibdev->ibdev.iwcm->create_listen = nes_create_listen;
|
||||
nesibdev->ibdev.iwcm->destroy_listen = nes_destroy_listen;
|
||||
|
||||
ib_set_device_ops(&nesibdev->ibdev, &nes_dev_ops);
|
||||
memcpy(nesibdev->ibdev.iwcm->ifname, netdev->name,
|
||||
sizeof(nesibdev->ibdev.iwcm->ifname));
|
||||
memcpy(nesibdev->ibdev.iw_ifname, netdev->name,
|
||||
sizeof(nesibdev->ibdev.iw_ifname));
|
||||
|
||||
return nesibdev;
|
||||
}
|
||||
@@ -3718,7 +3712,6 @@ void nes_destroy_ofa_device(struct nes_ib_device *nesibdev)
|
||||
|
||||
nes_unregister_ofa_device(nesibdev);
|
||||
|
||||
kfree(nesibdev->ibdev.iwcm);
|
||||
ib_dealloc_device(&nesibdev->ibdev);
|
||||
}
|
||||
|
||||
|
@@ -148,6 +148,14 @@ static const struct attribute_group qedr_attr_group = {
|
||||
|
||||
static const struct ib_device_ops qedr_iw_dev_ops = {
|
||||
.get_port_immutable = qedr_iw_port_immutable,
|
||||
.iw_accept = qedr_iw_accept,
|
||||
.iw_add_ref = qedr_iw_qp_add_ref,
|
||||
.iw_connect = qedr_iw_connect,
|
||||
.iw_create_listen = qedr_iw_create_listen,
|
||||
.iw_destroy_listen = qedr_iw_destroy_listen,
|
||||
.iw_get_qp = qedr_iw_get_qp,
|
||||
.iw_reject = qedr_iw_reject,
|
||||
.iw_rem_ref = qedr_iw_qp_rem_ref,
|
||||
.query_gid = qedr_iw_query_gid,
|
||||
};
|
||||
|
||||
@@ -157,21 +165,8 @@ static int qedr_iw_register_device(struct qedr_dev *dev)
|
||||
|
||||
ib_set_device_ops(&dev->ibdev, &qedr_iw_dev_ops);
|
||||
|
||||
dev->ibdev.iwcm = kzalloc(sizeof(*dev->ibdev.iwcm), GFP_KERNEL);
|
||||
if (!dev->ibdev.iwcm)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->ibdev.iwcm->connect = qedr_iw_connect;
|
||||
dev->ibdev.iwcm->accept = qedr_iw_accept;
|
||||
dev->ibdev.iwcm->reject = qedr_iw_reject;
|
||||
dev->ibdev.iwcm->create_listen = qedr_iw_create_listen;
|
||||
dev->ibdev.iwcm->destroy_listen = qedr_iw_destroy_listen;
|
||||
dev->ibdev.iwcm->add_ref = qedr_iw_qp_add_ref;
|
||||
dev->ibdev.iwcm->rem_ref = qedr_iw_qp_rem_ref;
|
||||
dev->ibdev.iwcm->get_qp = qedr_iw_get_qp;
|
||||
|
||||
memcpy(dev->ibdev.iwcm->ifname,
|
||||
dev->ndev->name, sizeof(dev->ibdev.iwcm->ifname));
|
||||
memcpy(dev->ibdev.iw_ifname,
|
||||
dev->ndev->name, sizeof(dev->ibdev.iw_ifname));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user