On 4/4/19 12:56 PM, Jason Gunthorpe wrote: > From: Jason Gunthorpe <jgg@xxxxxxxxxxxx> > > Drivers that never change their ndev dynamically do not need to use > the get_netdev callback. > > Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxxxx> > --- > drivers/infiniband/hw/bnxt_re/ib_verbs.c | 15 ---------- > drivers/infiniband/hw/bnxt_re/ib_verbs.h | 2 -- > drivers/infiniband/hw/bnxt_re/main.c | 6 +++- > drivers/infiniband/hw/hns/hns_roce_main.c | 30 +++++++------------ > drivers/infiniband/hw/ocrdma/ocrdma_main.c | 8 ++++- > drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 18 ----------- > drivers/infiniband/hw/ocrdma/ocrdma_verbs.h | 1 - > drivers/infiniband/hw/qedr/main.c | 19 +++--------- > .../infiniband/hw/vmw_pvrdma/pvrdma_main.c | 24 ++++----------- > 9 files changed, 31 insertions(+), 92 deletions(-) Thanks! The vmw_pvrdma changes seem fine. Acked-by: Adit Ranadive <aditr@xxxxxxxxxx> > > diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c > index dc53604171a087..8cf255054fda48 100644 > --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c > +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c > @@ -119,21 +119,6 @@ static int bnxt_re_build_sgl(struct ib_sge *ib_sg_list, > } > > /* Device */ > -struct net_device *bnxt_re_get_netdev(struct ib_device *ibdev, u8 port_num) > -{ > - struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev); > - struct net_device *netdev = NULL; > - > - rcu_read_lock(); > - if (rdev) > - netdev = rdev->netdev; > - if (netdev) > - dev_hold(netdev); > - > - rcu_read_unlock(); > - return netdev; > -} > - > int bnxt_re_query_device(struct ib_device *ibdev, > struct ib_device_attr *ib_attr, > struct ib_udata *udata) > diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/hw/bnxt_re/ib_verbs.h > index bd4fa22985eb04..09a33049e42f23 100644 > --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h > +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h > @@ -142,8 +142,6 @@ struct bnxt_re_ucontext { > spinlock_t sh_lock; /* protect shpg */ > }; > > -struct net_device *bnxt_re_get_netdev(struct ib_device *ibdev, u8 port_num); > - > int bnxt_re_query_device(struct ib_device *ibdev, > struct ib_device_attr *ib_attr, > struct ib_udata *udata); > diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c > index bbdfbbf5e9a53a..814f959c7db965 100644 > --- a/drivers/infiniband/hw/bnxt_re/main.c > +++ b/drivers/infiniband/hw/bnxt_re/main.c > @@ -617,7 +617,6 @@ static const struct ib_device_ops bnxt_re_dev_ops = { > .get_dma_mr = bnxt_re_get_dma_mr, > .get_hw_stats = bnxt_re_ib_get_hw_stats, > .get_link_layer = bnxt_re_get_link_layer, > - .get_netdev = bnxt_re_get_netdev, > .get_port_immutable = bnxt_re_get_port_immutable, > .map_mr_sg = bnxt_re_map_mr_sg, > .mmap = bnxt_re_mmap, > @@ -646,6 +645,7 @@ static const struct ib_device_ops bnxt_re_dev_ops = { > static int bnxt_re_register_ib(struct bnxt_re_dev *rdev) > { > struct ib_device *ibdev = &rdev->ibdev; > + int ret; > > /* ib device init */ > ibdev->owner = THIS_MODULE; > @@ -693,6 +693,10 @@ static int bnxt_re_register_ib(struct bnxt_re_dev *rdev) > rdma_set_device_sysfs_group(ibdev, &bnxt_re_dev_attr_group); > ibdev->driver_id = RDMA_DRIVER_BNXT_RE; > ib_set_device_ops(ibdev, &bnxt_re_dev_ops); > + ret = ib_device_set_netdev(&rdev->ibdev, rdev->netdev, 1); > + if (ret) > + return ret; > + > return ib_register_device(ibdev, "bnxt_re%d"); > } > > diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c > index 363a996f475e82..8da5f18bf820be 100644 > --- a/drivers/infiniband/hw/hns/hns_roce_main.c > +++ b/drivers/infiniband/hw/hns/hns_roce_main.c > @@ -234,25 +234,6 @@ static int hns_roce_query_device(struct ib_device *ib_dev, > return 0; > } > > -static struct net_device *hns_roce_get_netdev(struct ib_device *ib_dev, > - u8 port_num) > -{ > - struct hns_roce_dev *hr_dev = to_hr_dev(ib_dev); > - struct net_device *ndev; > - > - if (port_num < 1 || port_num > hr_dev->caps.num_ports) > - return NULL; > - > - rcu_read_lock(); > - > - ndev = hr_dev->iboe.netdevs[port_num - 1]; > - if (ndev) > - dev_hold(ndev); > - > - rcu_read_unlock(); > - return ndev; > -} > - > static int hns_roce_query_port(struct ib_device *ib_dev, u8 port_num, > struct ib_port_attr *props) > { > @@ -458,7 +439,6 @@ static const struct ib_device_ops hns_roce_dev_ops = { > .fill_res_entry = hns_roce_fill_res_entry, > .get_dma_mr = hns_roce_get_dma_mr, > .get_link_layer = hns_roce_get_link_layer, > - .get_netdev = hns_roce_get_netdev, > .get_port_immutable = hns_roce_port_immutable, > .mmap = hns_roce_mmap, > .modify_device = hns_roce_modify_device, > @@ -502,6 +482,7 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev) > struct hns_roce_ib_iboe *iboe = NULL; > struct ib_device *ib_dev = NULL; > struct device *dev = hr_dev->dev; > + unsigned int i; > > iboe = &hr_dev->iboe; > spin_lock_init(&iboe->lock); > @@ -567,6 +548,15 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev) > ib_dev->driver_id = RDMA_DRIVER_HNS; > ib_set_device_ops(ib_dev, hr_dev->hw->hns_roce_dev_ops); > ib_set_device_ops(ib_dev, &hns_roce_dev_ops); > + for (i = 0; i < hr_dev->caps.num_ports; i++) { > + if (!hr_dev->iboe.netdevs[i]) > + continue; > + > + ret = ib_device_set_netdev(ib_dev, hr_dev->iboe.netdevs[i], > + i + 1); > + if (ret) > + return ret; > + } > ret = ib_register_device(ib_dev, "hns_%d"); > if (ret) { > dev_err(dev, "ib_register_device failed!\n"); > diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_main.c b/drivers/infiniband/hw/ocrdma/ocrdma_main.c > index 34d3d59f3ca755..52d10c86caf2f0 100644 > --- a/drivers/infiniband/hw/ocrdma/ocrdma_main.c > +++ b/drivers/infiniband/hw/ocrdma/ocrdma_main.c > @@ -161,7 +161,6 @@ static const struct ib_device_ops ocrdma_dev_ops = { > .get_dev_fw_str = get_dev_fw_str, > .get_dma_mr = ocrdma_get_dma_mr, > .get_link_layer = ocrdma_link_layer, > - .get_netdev = ocrdma_get_netdev, > .get_port_immutable = ocrdma_port_immutable, > .map_mr_sg = ocrdma_map_mr_sg, > .mmap = ocrdma_mmap, > @@ -197,6 +196,8 @@ static const struct ib_device_ops ocrdma_dev_srq_ops = { > > static int ocrdma_register_device(struct ocrdma_dev *dev) > { > + int ret; > + > ocrdma_get_guid(dev, (u8 *)&dev->ibdev.node_guid); > BUILD_BUG_ON(sizeof(OCRDMA_NODE_DESC) > IB_DEVICE_NODE_DESC_MAX); > memcpy(dev->ibdev.node_desc, OCRDMA_NODE_DESC, > @@ -251,6 +252,10 @@ static int ocrdma_register_device(struct ocrdma_dev *dev) > } > rdma_set_device_sysfs_group(&dev->ibdev, &ocrdma_attr_group); > dev->ibdev.driver_id = RDMA_DRIVER_OCRDMA; > + ret = ib_device_set_netdev(&dev->ibdev, dev->nic_info.netdev, 1); > + if (ret) > + return ret; > + > return ib_register_device(&dev->ibdev, "ocrdma%d"); > } > > @@ -308,6 +313,7 @@ static struct ocrdma_dev *ocrdma_add(struct be_dev_info *dev_info) > pr_err("Unable to allocate ib device\n"); > return NULL; > } > + > dev->mbx_cmd = kzalloc(sizeof(struct ocrdma_mqe_emb_cmd), GFP_KERNEL); > if (!dev->mbx_cmd) > goto idr_err; > diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c > index ffdd3ac550869e..35ec87015792ce 100644 > --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c > +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c > @@ -113,24 +113,6 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr, > return 0; > } > > -struct net_device *ocrdma_get_netdev(struct ib_device *ibdev, u8 port_num) > -{ > - struct ocrdma_dev *dev; > - struct net_device *ndev = NULL; > - > - rcu_read_lock(); > - > - dev = get_ocrdma_dev(ibdev); > - if (dev) > - ndev = dev->nic_info.netdev; > - if (ndev) > - dev_hold(ndev); > - > - rcu_read_unlock(); > - > - return ndev; > -} > - > static inline void get_link_speed_and_width(struct ocrdma_dev *dev, > u8 *ib_speed, u8 *ib_width) > { > diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h > index c6489a1439dcb9..d76aae7ed0d369 100644 > --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h > +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h > @@ -61,7 +61,6 @@ enum rdma_protocol_type > ocrdma_query_protocol(struct ib_device *device, u8 port_num); > > void ocrdma_get_guid(struct ocrdma_dev *, u8 *guid); > -struct net_device *ocrdma_get_netdev(struct ib_device *device, u8 port_num); > int ocrdma_query_pkey(struct ib_device *, u8 port, u16 index, u16 *pkey); > > int ocrdma_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata); > diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr/main.c > index cbcdc5c669c67c..a0a49ed2686019 100644 > --- a/drivers/infiniband/hw/qedr/main.c > +++ b/drivers/infiniband/hw/qedr/main.c > @@ -81,20 +81,6 @@ static void qedr_get_dev_fw_str(struct ib_device *ibdev, char *str) > (fw_ver >> 8) & 0xFF, fw_ver & 0xFF); > } > > -static struct net_device *qedr_get_netdev(struct ib_device *dev, u8 port_num) > -{ > - struct qedr_dev *qdev; > - > - qdev = get_qedr_dev(dev); > - dev_hold(qdev->ndev); > - > - /* The HW vendor's device driver must guarantee > - * that this function returns NULL before the net device has finished > - * NETDEV_UNREGISTER state. > - */ > - return qdev->ndev; > -} > - > static int qedr_roce_port_immutable(struct ib_device *ibdev, u8 port_num, > struct ib_port_immutable *immutable) > { > @@ -219,7 +205,6 @@ static const struct ib_device_ops qedr_dev_ops = { > .get_dev_fw_str = qedr_get_dev_fw_str, > .get_dma_mr = qedr_get_dma_mr, > .get_link_layer = qedr_link_layer, > - .get_netdev = qedr_get_netdev, > .map_mr_sg = qedr_map_mr_sg, > .mmap = qedr_mmap, > .modify_port = qedr_modify_port, > @@ -295,6 +280,10 @@ static int qedr_register_device(struct qedr_dev *dev) > ib_set_device_ops(&dev->ibdev, &qedr_dev_ops); > > dev->ibdev.driver_id = RDMA_DRIVER_QEDR; > + rc = ib_device_set_netdev(&dev->ibdev, dev->ndev, 1); > + if (rc) > + return rc; > + > return ib_register_device(&dev->ibdev, "qedr%d"); > } > > diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c > index 128ecd483b5018..40182297f87fd5 100644 > --- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c > +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c > @@ -143,24 +143,6 @@ static int pvrdma_port_immutable(struct ib_device *ibdev, u8 port_num, > return 0; > } > > -static struct net_device *pvrdma_get_netdev(struct ib_device *ibdev, > - u8 port_num) > -{ > - struct net_device *netdev; > - struct pvrdma_dev *dev = to_vdev(ibdev); > - > - if (port_num != 1) > - return NULL; > - > - rcu_read_lock(); > - netdev = dev->netdev; > - if (netdev) > - dev_hold(netdev); > - rcu_read_unlock(); > - > - return netdev; > -} > - > static const struct ib_device_ops pvrdma_dev_ops = { > .add_gid = pvrdma_add_gid, > .alloc_mr = pvrdma_alloc_mr, > @@ -179,7 +161,6 @@ static const struct ib_device_ops pvrdma_dev_ops = { > .get_dev_fw_str = pvrdma_get_fw_ver_str, > .get_dma_mr = pvrdma_get_dma_mr, > .get_link_layer = pvrdma_port_link_layer, > - .get_netdev = pvrdma_get_netdev, > .get_port_immutable = pvrdma_port_immutable, > .map_mr_sg = pvrdma_map_mr_sg, > .mmap = pvrdma_mmap, > @@ -281,6 +262,9 @@ static int pvrdma_register_device(struct pvrdma_dev *dev) > goto err_qp_free; > } > dev->ib_dev.driver_id = RDMA_DRIVER_VMW_PVRDMA; > + ret = ib_device_set_netdev(&dev->ib_dev, dev->netdev, 1); > + if (ret) > + return ret; > spin_lock_init(&dev->srq_tbl_lock); > rdma_set_device_sysfs_group(&dev->ib_dev, &pvrdma_attr_group); > > @@ -724,6 +708,7 @@ static void pvrdma_netdevice_event_handle(struct pvrdma_dev *dev, > pvrdma_dispatch_event(dev, 1, IB_EVENT_PORT_ACTIVE); > break; > case NETDEV_UNREGISTER: > + ib_device_set_netdev(&dev->ib_dev, NULL, 1); > dev_put(dev->netdev); > dev->netdev = NULL; > break; > @@ -735,6 +720,7 @@ static void pvrdma_netdevice_event_handle(struct pvrdma_dev *dev, > if ((dev->netdev == NULL) && > (pci_get_drvdata(pdev_net) == ndev)) { > /* this is our netdev */ > + ib_device_set_netdev(&dev->ib_dev, ndev, 1); > dev->netdev = ndev; > dev_hold(ndev); > } >