On 4/29/19 3:06 PM, Leon Romanovsky wrote: > On Mon, Apr 29, 2019 at 02:59:06PM +0300, Kamal Heib wrote: >> 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. >> 2- Make the code more cleaner. >> 3- Reduce code duplication. >> >> Signed-off-by: Kamal Heib <kamalheib1@xxxxxxxxx> >> --- >> drivers/infiniband/core/device.c | 8 +++++ >> drivers/infiniband/core/iwcm.c | 35 +++++++++++---------- >> drivers/infiniband/hw/cxgb3/iwch_provider.c | 32 +++++++------------ >> drivers/infiniband/hw/cxgb4/provider.c | 33 +++++++------------ >> drivers/infiniband/hw/i40iw/i40iw_verbs.c | 30 ++++++------------ >> drivers/infiniband/hw/nes/nes_verbs.c | 27 ++++++---------- >> drivers/infiniband/hw/qedr/main.c | 25 ++++++--------- >> include/rdma/ib_verbs.h | 23 +++++++++++--- >> 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 fcbf2d4c865d..b1dc0454151c 100644 >> --- a/drivers/infiniband/core/device.c >> +++ b/drivers/infiniband/core/device.c >> @@ -2310,6 +2310,14 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops) >> SET_DEVICE_OP(dev_ops, get_vf_config); >> SET_DEVICE_OP(dev_ops, get_vf_stats); >> SET_DEVICE_OP(dev_ops, init_port); >> + SET_DEVICE_OP(dev_ops, iw_accept); >> + SET_DEVICE_OP(dev_ops, iw_add_ref); >> + SET_DEVICE_OP(dev_ops, iw_connect); >> + SET_DEVICE_OP(dev_ops, iw_create_listen); >> + SET_DEVICE_OP(dev_ops, iw_destroy_listen); >> + SET_DEVICE_OP(dev_ops, iw_get_qp); >> + SET_DEVICE_OP(dev_ops, iw_reject); >> + SET_DEVICE_OP(dev_ops, iw_rem_ref); >> SET_DEVICE_OP(dev_ops, map_mr_sg); >> SET_DEVICE_OP(dev_ops, map_phys_fmr); >> SET_DEVICE_OP(dev_ops, mmap); >> diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c >> index 732637c913d9..ac56762e7e93 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) >> cm_id_priv->state = IW_CM_STATE_DESTROYING; >> spin_unlock_irqrestore(&cm_id_priv->lock, flags); >> /* destroy the listening endpoint */ >> - cm_id->device->iwcm->destroy_listen(cm_id); >> + cm_id->device->ops.iw_destroy_listen(cm_id); >> spin_lock_irqsave(&cm_id_priv->lock, flags); >> break; >> case IW_CM_STATE_ESTABLISHED: >> @@ -417,7 +417,7 @@ static void destroy_cm_id(struct iw_cm_id *cm_id) >> */ >> cm_id_priv->state = IW_CM_STATE_DESTROYING; >> spin_unlock_irqrestore(&cm_id_priv->lock, flags); >> - cm_id->device->iwcm->reject(cm_id, NULL, 0); >> + cm_id->device->ops.iw_reject(cm_id, NULL, 0); >> spin_lock_irqsave(&cm_id_priv->lock, flags); >> break; >> case IW_CM_STATE_CONN_SENT: >> @@ -427,7 +427,7 @@ static void destroy_cm_id(struct iw_cm_id *cm_id) >> break; >> } >> if (cm_id_priv->qp) { >> - cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp); >> + cm_id_priv->id.device->ops.iw_rem_ref(cm_id_priv->qp); >> cm_id_priv->qp = NULL; >> } >> spin_unlock_irqrestore(&cm_id_priv->lock, flags); >> @@ -504,7 +504,7 @@ static void iw_cm_check_wildcard(struct sockaddr_storage *pm_addr, >> static int iw_cm_map(struct iw_cm_id *cm_id, bool active) >> { >> const char *devname = dev_name(&cm_id->device->dev); >> - const char *ifname = cm_id->device->iwcm->ifname; >> + const char *ifname = cm_id->device->iw_ifname; >> struct iwpm_dev_data pm_reg_msg = {}; >> struct iwpm_sa_data pm_msg; >> int status; >> @@ -526,7 +526,7 @@ static int iw_cm_map(struct iw_cm_id *cm_id, bool active) >> cm_id->mapped = true; >> pm_msg.loc_addr = cm_id->local_addr; >> pm_msg.rem_addr = cm_id->remote_addr; >> - pm_msg.flags = (cm_id->device->iwcm->driver_flags & IW_F_NO_PORT_MAP) ? >> + pm_msg.flags = (cm_id->device->iw_driver_flags & IW_F_NO_PORT_MAP) ? >> IWPM_FLAGS_NO_PORT_MAP : 0; > > There are no drivers that set driver_flags and IW_F_NO_PORT_MAP. > I think that you can safely remove it. > Hi Steve, Could you please add more info about the use of the driver_flags? It was introduced for the first time as part of the following commit and I don't see any use for it or for the IW_F_NO_PORT_MAP & IWPM_FLAGS_NO_PORT_MAP enums. commit b0bad9ad514fc1dd8890f1749f5d2425a73270e3 Author: Steve Wise <swise@xxxxxxxxxxxxxxxxxxxxx> Date: Tue Jan 29 13:33:16 2019 -0800 RDMA/IWPM: Support no port mapping requirements A soft iwarp driver that uses the host TCP stack via a kernel mode socket does not need port mapping. In fact, if the port map daemon, iwpmd, is running, then iwpmd must not try and create/bind a socket to the actual port for a soft iwarp connection, since the driver already has that socket bound. Yet if the soft iwarp driver wants to interoperate with hard iwarp devices that -are- using port mapping, then the soft iwarp driver's mappings still need to be maintained and advertised by the iwpm protocol. This patch enhances the rdma driver<->iwcm interface to allow an iwarp driver to specify that it does not want port mapping. The iwpm kernel<->iwpmd interface is also enhanced to pass up this information on map requests. Care is taken to interoperate with the current iwpmd version (ABI version 3) and only use the new NL attributes if iwpmd supports ABI version 4. The ABI version define has also been created in rdma_netlink.h so both kernel and user code can share it. The iwcm and iwpmd negotiate the ABI version to use with a new HELLO netlink message. Signed-off-by: Steve Wise <swise@xxxxxxxxxxxxxxxxxxxxx> Reviewed-by: Tatyana Nikolova <Tatyana.E.Nikolova@xxxxxxxxx> Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxxxx> >> if (active) >> status = iwpm_add_and_query_mapping(&pm_msg, >> @@ -577,7 +577,8 @@ int iw_cm_listen(struct iw_cm_id *cm_id, int backlog) >> spin_unlock_irqrestore(&cm_id_priv->lock, flags); >> ret = iw_cm_map(cm_id, false); >> if (!ret) >> - ret = cm_id->device->iwcm->create_listen(cm_id, backlog); >> + ret = cm_id->device->ops.iw_create_listen(cm_id, >> + backlog); >> if (ret) >> cm_id_priv->state = IW_CM_STATE_IDLE; >> spin_lock_irqsave(&cm_id_priv->lock, flags); >> @@ -617,7 +618,7 @@ int iw_cm_reject(struct iw_cm_id *cm_id, >> cm_id_priv->state = IW_CM_STATE_IDLE; >> spin_unlock_irqrestore(&cm_id_priv->lock, flags); >> >> - ret = cm_id->device->iwcm->reject(cm_id, private_data, >> + ret = cm_id->device->ops.iw_reject(cm_id, private_data, >> private_data_len); >> >> clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags); >> @@ -653,25 +654,25 @@ int iw_cm_accept(struct iw_cm_id *cm_id, >> return -EINVAL; >> } >> /* Get the ib_qp given the QPN */ >> - qp = cm_id->device->iwcm->get_qp(cm_id->device, iw_param->qpn); >> + qp = cm_id->device->ops.iw_get_qp(cm_id->device, iw_param->qpn); >> if (!qp) { >> spin_unlock_irqrestore(&cm_id_priv->lock, flags); >> clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags); >> wake_up_all(&cm_id_priv->connect_wait); >> return -EINVAL; >> } >> - cm_id->device->iwcm->add_ref(qp); >> + cm_id->device->ops.iw_add_ref(qp); >> cm_id_priv->qp = qp; >> spin_unlock_irqrestore(&cm_id_priv->lock, flags); >> >> - ret = cm_id->device->iwcm->accept(cm_id, iw_param); >> + ret = cm_id->device->ops.iw_accept(cm_id, iw_param); >> if (ret) { >> /* An error on accept precludes provider events */ >> BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_RECV); >> cm_id_priv->state = IW_CM_STATE_IDLE; >> spin_lock_irqsave(&cm_id_priv->lock, flags); >> if (cm_id_priv->qp) { >> - cm_id->device->iwcm->rem_ref(qp); >> + cm_id->device->ops.iw_rem_ref(qp); >> cm_id_priv->qp = NULL; >> } >> 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) >> } >> >> /* Get the ib_qp given the QPN */ >> - qp = cm_id->device->iwcm->get_qp(cm_id->device, iw_param->qpn); >> + qp = cm_id->device->ops.iw_get_qp(cm_id->device, iw_param->qpn); >> if (!qp) { >> ret = -EINVAL; >> goto err; >> } >> - cm_id->device->iwcm->add_ref(qp); >> + cm_id->device->ops.iw_add_ref(qp); >> cm_id_priv->qp = qp; >> cm_id_priv->state = IW_CM_STATE_CONN_SENT; >> spin_unlock_irqrestore(&cm_id_priv->lock, flags); >> >> ret = iw_cm_map(cm_id, true); >> if (!ret) >> - ret = cm_id->device->iwcm->connect(cm_id, iw_param); >> + ret = cm_id->device->ops.iw_connect(cm_id, iw_param); >> if (!ret) >> return 0; /* success */ >> >> spin_lock_irqsave(&cm_id_priv->lock, flags); >> if (cm_id_priv->qp) { >> - cm_id->device->iwcm->rem_ref(qp); >> + cm_id->device->ops.iw_rem_ref(qp); >> cm_id_priv->qp = NULL; >> } >> 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, >> cm_id_priv->state = IW_CM_STATE_ESTABLISHED; >> } else { >> /* REJECTED or RESET */ >> - cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp); >> + cm_id_priv->id.device->ops.iw_rem_ref(cm_id_priv->qp); >> cm_id_priv->qp = NULL; >> cm_id_priv->state = IW_CM_STATE_IDLE; >> } >> @@ -946,7 +947,7 @@ static int cm_close_handler(struct iwcm_id_private *cm_id_priv, >> spin_lock_irqsave(&cm_id_priv->lock, flags); >> >> if (cm_id_priv->qp) { >> - cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp); >> + cm_id_priv->id.device->ops.iw_rem_ref(cm_id_priv->qp); >> cm_id_priv->qp = NULL; >> } >> 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 = { >> .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; >> } >> 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 = { >> .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; >> } >> 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 = { >> .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; >> } >> 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 = { >> .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); >> } >> >> 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 = { >> >> 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; >> } >> diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h >> index 43a75ab8ea8a..efaae57edccd 100644 >> --- a/include/rdma/ib_verbs.h >> +++ b/include/rdma/ib_verbs.h >> @@ -2191,8 +2191,6 @@ struct ib_cache { >> struct ib_event_handler event_handler; >> }; >> >> -struct iw_cm_verbs; >> - >> struct ib_port_immutable { >> int pkey_tbl_len; >> int gid_tbl_len; >> @@ -2274,6 +2272,8 @@ struct ib_counters_read_attr { >> }; >> >> struct uverbs_attr_bundle; >> +struct iw_cm_id; >> +struct iw_cm_conn_param; >> >> #define INIT_RDMA_OBJ_SIZE(ib_struct, drv_struct, member) \ >> .size_##ib_struct = \ >> @@ -2551,6 +2551,19 @@ struct ib_device_ops { >> */ >> void (*dealloc_driver)(struct ib_device *dev); >> >> + /* iWarp CM callbacks */ >> + void (*iw_add_ref)(struct ib_qp *qp); >> + void (*iw_rem_ref)(struct ib_qp *qp); >> + struct ib_qp *(*iw_get_qp)(struct ib_device *device, int qpn); >> + int (*iw_connect)(struct iw_cm_id *cm_id, >> + struct iw_cm_conn_param *conn_param); >> + int (*iw_accept)(struct iw_cm_id *cm_id, >> + struct iw_cm_conn_param *conn_param); >> + int (*iw_reject)(struct iw_cm_id *cm_id, const void *pdata, >> + u8 pdata_len); >> + int (*iw_create_listen)(struct iw_cm_id *cm_id, int backlog); >> + int (*iw_destroy_listen)(struct iw_cm_id *cm_id); >> + >> DECLARE_RDMA_OBJ_SIZE(ib_ah); >> DECLARE_RDMA_OBJ_SIZE(ib_pd); >> DECLARE_RDMA_OBJ_SIZE(ib_srq); >> @@ -2591,8 +2604,6 @@ struct ib_device { >> >> int num_comp_vectors; >> >> - struct iw_cm_verbs *iwcm; >> - >> struct module *owner; >> union { >> struct device dev; >> @@ -2645,6 +2656,10 @@ struct ib_device { >> struct mutex compat_devs_mutex; >> /* Maintains compat devices for each net namespace */ >> struct xarray compat_devs; >> + >> + /* Used by iWarp CM */ >> + char iw_ifname[IFNAMSIZ]; >> + u32 iw_driver_flags; > > No one sets this field. > >> }; >> >> 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 { >> IW_F_NO_PORT_MAP = (1 << 0), >> }; >> >> -struct iw_cm_verbs { >> - void (*add_ref)(struct ib_qp *qp); >> - >> - void (*rem_ref)(struct ib_qp *qp); >> - >> - struct ib_qp * (*get_qp)(struct ib_device *device, >> - int qpn); >> - >> - int (*connect)(struct iw_cm_id *cm_id, >> - struct iw_cm_conn_param *conn_param); >> - >> - int (*accept)(struct iw_cm_id *cm_id, >> - struct iw_cm_conn_param *conn_param); >> - >> - int (*reject)(struct iw_cm_id *cm_id, >> - const void *pdata, u8 pdata_len); >> - >> - int (*create_listen)(struct iw_cm_id *cm_id, >> - int backlog); >> - >> - int (*destroy_listen)(struct iw_cm_id *cm_id); >> - char ifname[IFNAMSIZ]; >> - enum iw_flags driver_flags; >> -}; >> - >> /** >> * iw_create_cm_id - Create an IW CM identifier. >> * >> -- >> 2.20.1 >>