>-----Original Message----- >From: Jason Gunthorpe <jgg@xxxxxxxxxxxx> > >The current code has two copies of the device name, ibdev->dev and >dev_name(&ibdev->dev), and they are setup at different times, which is >very confusing. > >Set them both up at the same time and make dev_name() the lead name, >which >is the proper use of the driver core APIs. To make it very clear that the >name is not valid until registration pass it in to the >ib_register_device() call rather than messing with ibdev->name directly. > >Also the reorganization now checks that dev_name is unique even if it does >not contain a %. > >Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxxxx> >--- > drivers/infiniband/hw/hfi1/init.c | 1 - > drivers/infiniband/hw/hfi1/verbs.c | 4 ++- > drivers/infiniband/hw/qib/qib_init.c | 1 - > drivers/infiniband/hw/qib/qib_verbs.c | 4 ++- >diff --git a/drivers/infiniband/hw/hfi1/init.c >b/drivers/infiniband/hw/hfi1/init.c >index 1e770a1337793e..e87ff7a544eb1a 100644 >--- a/drivers/infiniband/hw/hfi1/init.c >+++ b/drivers/infiniband/hw/hfi1/init.c >@@ -1313,7 +1313,6 @@ static struct hfi1_devdata *hfi1_alloc_devdata(struct >pci_dev *pdev, > "Could not allocate unit ID: error %d\n", -ret); > goto bail; > } >- rvt_set_ibdev_name(&dd->verbs_dev.rdi, "%s_%d", class_name(), >dd->unit); If you remove this call, the HFI (and probably the QIB) dd_dev_xxx() macros will not work correctly until we call ib_register(). Since we do a lot of work before that, this will lose our ability to print out the device name. I will need to look at this a bit more and see what we need to change from our perspective to make this change work. For the moment NAK. Mike > > /* > * Initialize all locks for the device. This needs to be as early as >diff --git a/drivers/infiniband/hw/hfi1/verbs.c >b/drivers/infiniband/hw/hfi1/verbs.c >index 13374c727b142d..0376964a4eba15 100644 >--- a/drivers/infiniband/hw/hfi1/verbs.c >+++ b/drivers/infiniband/hw/hfi1/verbs.c >@@ -1843,6 +1843,7 @@ int hfi1_register_ib_device(struct hfi1_devdata *dd) > struct ib_device *ibdev = &dev->rdi.ibdev; > struct hfi1_pportdata *ppd = dd->pport; > struct hfi1_ibport *ibp = &ppd->ibport_data; >+ char name[IB_DEVICE_NAME_MAX]; > unsigned i; > int ret; > >@@ -1961,7 +1962,8 @@ int hfi1_register_ib_device(struct hfi1_devdata *dd) > i, > ppd->pkeys); > >- ret = rvt_register_device(&dd->verbs_dev.rdi, RDMA_DRIVER_HFI1); >+ snprintf(name, sizeof(name), "%s_%d", class_name(), dd->unit); >+ ret = rvt_register_device(&dd->verbs_dev.rdi, name, >RDMA_DRIVER_HFI1); > if (ret) > goto err_verbs_txreq; > >diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c >b/drivers/infiniband/hw/hns/hns_roce_main.c >index c5cae9a38c0443..46357f94e6ef84 100644 >--- a/drivers/infiniband/hw/hns/hns_roce_main.c >+++ b/drivers/infiniband/hw/hns/hns_roce_main.c >@@ -508,7 +508,6 @@ static int hns_roce_register_device(struct >hns_roce_dev *hr_dev) > spin_lock_init(&iboe->lock); > > ib_dev = &hr_dev->ib_dev; >- strlcpy(ib_dev->name, "hns_%d", IB_DEVICE_NAME_MAX); > > ib_dev->owner = THIS_MODULE; > ib_dev->node_type = RDMA_NODE_IB_CA; >@@ -589,7 +588,7 @@ static int hns_roce_register_device(struct >hns_roce_dev *hr_dev) > ib_dev->disassociate_ucontext = >hns_roce_disassociate_ucontext; > > ib_dev->driver_id = RDMA_DRIVER_HNS; >- ret = ib_register_device(ib_dev, NULL); >+ ret = ib_register_device(ib_dev, "hns_%d", NULL); > if (ret) { > dev_err(dev, "ib_register_device failed!\n"); > return ret; >diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c >b/drivers/infiniband/hw/i40iw/i40iw_verbs.c >index e2e6c74a745225..cb2aef874ca85f 100644 >--- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c >+++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c >@@ -2752,7 +2752,6 @@ static struct i40iw_ib_device >*i40iw_init_rdma_device(struct i40iw_device *iwdev > i40iw_pr_err("iwdev == NULL\n"); > return NULL; > } >- strlcpy(iwibdev->ibdev.name, "i40iw%d", IB_DEVICE_NAME_MAX); > iwibdev->ibdev.owner = THIS_MODULE; > iwdev->iwibdev = iwibdev; > iwibdev->iwdev = iwdev; >@@ -2897,7 +2896,7 @@ int i40iw_register_rdma_device(struct i40iw_device >*iwdev) > iwibdev = iwdev->iwibdev; > > iwibdev->ibdev.driver_id = RDMA_DRIVER_I40IW; >- ret = ib_register_device(&iwibdev->ibdev, NULL); >+ ret = ib_register_device(&iwibdev->ibdev, "i40iw%d", NULL); > if (ret) > goto error; > >diff --git a/drivers/infiniband/hw/mlx4/main.c >b/drivers/infiniband/hw/mlx4/main.c >index ca0f1ee26091b3..be4dcefa058377 100644 >--- a/drivers/infiniband/hw/mlx4/main.c >+++ b/drivers/infiniband/hw/mlx4/main.c >@@ -2634,7 +2634,6 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) > ibdev->dev = dev; > ibdev->bond_next_port = 0; > >- strlcpy(ibdev->ib_dev.name, "mlx4_%d", IB_DEVICE_NAME_MAX); > ibdev->ib_dev.owner = THIS_MODULE; > ibdev->ib_dev.node_type = RDMA_NODE_IB_CA; > ibdev->ib_dev.local_dma_lkey = dev->caps.reserved_lkey; >@@ -2897,7 +2896,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) > goto err_steer_free_bitmap; > > ibdev->ib_dev.driver_id = RDMA_DRIVER_MLX4; >- if (ib_register_device(&ibdev->ib_dev, NULL)) >+ if (ib_register_device(&ibdev->ib_dev, "mlx4_%d", NULL)) > goto err_diag_counters; > > if (mlx4_ib_mad_init(ibdev)) >diff --git a/drivers/infiniband/hw/mlx5/main.c >b/drivers/infiniband/hw/mlx5/main.c >index 2be6a437755819..4e8d497d99bd5d 100644 >--- a/drivers/infiniband/hw/mlx5/main.c >+++ b/drivers/infiniband/hw/mlx5/main.c >@@ -5724,7 +5724,6 @@ void mlx5_ib_stage_init_cleanup(struct >mlx5_ib_dev *dev) > int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev) > { > struct mlx5_core_dev *mdev = dev->mdev; >- const char *name; > int err; > int i; > >@@ -5757,12 +5756,6 @@ int mlx5_ib_stage_init_init(struct mlx5_ib_dev >*dev) > if (mlx5_use_mad_ifc(dev)) > get_ext_port_caps(dev); > >- if (!mlx5_lag_is_active(mdev)) >- name = "mlx5_%d"; >- else >- name = "mlx5_bond_%d"; >- >- strlcpy(dev->ib_dev.name, name, IB_DEVICE_NAME_MAX); > dev->ib_dev.owner = THIS_MODULE; > dev->ib_dev.node_type = RDMA_NODE_IB_CA; > dev->ib_dev.local_dma_lkey = 0 /* not supported for now */; >@@ -6175,7 +6168,13 @@ static int mlx5_ib_stage_populate_specs(struct >mlx5_ib_dev *dev) > > int mlx5_ib_stage_ib_reg_init(struct mlx5_ib_dev *dev) > { >- return ib_register_device(&dev->ib_dev, NULL); >+ const char *name; >+ >+ if (!mlx5_lag_is_active(dev->mdev)) >+ name = "mlx5_%d"; >+ else >+ name = "mlx5_bond_%d"; >+ return ib_register_device(&dev->ib_dev, name, NULL); > } > > void mlx5_ib_stage_pre_ib_reg_umr_cleanup(struct mlx5_ib_dev *dev) >diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c >b/drivers/infiniband/hw/mthca/mthca_provider.c >index 0d3473b4596e16..7bd7e2ad17e4cd 100644 >--- a/drivers/infiniband/hw/mthca/mthca_provider.c >+++ b/drivers/infiniband/hw/mthca/mthca_provider.c >@@ -1198,7 +1198,6 @@ int mthca_register_device(struct mthca_dev *dev) > if (ret) > return ret; > >- strlcpy(dev->ib_dev.name, "mthca%d", IB_DEVICE_NAME_MAX); > dev->ib_dev.owner = THIS_MODULE; > > dev->ib_dev.uverbs_abi_ver = MTHCA_UVERBS_ABI_VERSION; >@@ -1297,7 +1296,7 @@ int mthca_register_device(struct mthca_dev *dev) > mutex_init(&dev->cap_mask_mutex); > > dev->ib_dev.driver_id = RDMA_DRIVER_MTHCA; >- ret = ib_register_device(&dev->ib_dev, NULL); >+ ret = ib_register_device(&dev->ib_dev, "mthca%d", NULL); > if (ret) > return ret; > >diff --git a/drivers/infiniband/hw/nes/nes_verbs.c >b/drivers/infiniband/hw/nes/nes_verbs.c >index 6940c72159610d..2127cd2f4becc1 100644 >--- a/drivers/infiniband/hw/nes/nes_verbs.c >+++ b/drivers/infiniband/hw/nes/nes_verbs.c >@@ -3640,7 +3640,6 @@ struct nes_ib_device *nes_init_ofa_device(struct >net_device *netdev) > if (nesibdev == NULL) { > return NULL; > } >- strlcpy(nesibdev->ibdev.name, "nes%d", IB_DEVICE_NAME_MAX); > nesibdev->ibdev.owner = THIS_MODULE; > > nesibdev->ibdev.node_type = RDMA_NODE_RNIC; >@@ -3798,7 +3797,7 @@ int nes_register_ofa_device(struct nes_ib_device >*nesibdev) > int i, ret; > > nesvnic->nesibdev->ibdev.driver_id = RDMA_DRIVER_NES; >- ret = ib_register_device(&nesvnic->nesibdev->ibdev, NULL); >+ ret = ib_register_device(&nesvnic->nesibdev->ibdev, "nes%d", >NULL); > if (ret) { > return ret; > } >diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_main.c >b/drivers/infiniband/hw/ocrdma/ocrdma_main.c >index 7832ee3e0c8491..4d3c27613351d8 100644 >--- a/drivers/infiniband/hw/ocrdma/ocrdma_main.c >+++ b/drivers/infiniband/hw/ocrdma/ocrdma_main.c >@@ -116,7 +116,6 @@ static void get_dev_fw_str(struct ib_device *device, >char *str) > > static int ocrdma_register_device(struct ocrdma_dev *dev) > { >- strlcpy(dev->ibdev.name, "ocrdma%d", IB_DEVICE_NAME_MAX); > 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, >@@ -214,7 +213,7 @@ static int ocrdma_register_device(struct ocrdma_dev >*dev) > dev->ibdev.post_srq_recv = ocrdma_post_srq_recv; > } > dev->ibdev.driver_id = RDMA_DRIVER_OCRDMA; >- return ib_register_device(&dev->ibdev, NULL); >+ return ib_register_device(&dev->ibdev, "ocrdma%d", NULL); > } > > static int ocrdma_alloc_resources(struct ocrdma_dev *dev) >diff --git a/drivers/infiniband/hw/qedr/main.c >b/drivers/infiniband/hw/qedr/main.c >index a0af6d424aeda5..cd7b8b39a12983 100644 >--- a/drivers/infiniband/hw/qedr/main.c >+++ b/drivers/infiniband/hw/qedr/main.c >@@ -170,8 +170,6 @@ static int qedr_register_device(struct qedr_dev *dev) > { > int rc; > >- strlcpy(dev->ibdev.name, "qedr%d", IB_DEVICE_NAME_MAX); >- > dev->ibdev.node_guid = dev->attr.node_guid; > memcpy(dev->ibdev.node_desc, QEDR_NODE_DESC, >sizeof(QEDR_NODE_DESC)); > dev->ibdev.owner = THIS_MODULE; >@@ -264,7 +262,7 @@ static int qedr_register_device(struct qedr_dev *dev) > dev->ibdev.get_dev_fw_str = qedr_get_dev_fw_str; > > dev->ibdev.driver_id = RDMA_DRIVER_QEDR; >- return ib_register_device(&dev->ibdev, NULL); >+ return ib_register_device(&dev->ibdev, "qedr%d", NULL); > } > > /* This function allocates fast-path status block memory */ >diff --git a/drivers/infiniband/hw/qib/qib_init.c >b/drivers/infiniband/hw/qib/qib_init.c >index d7cdc77d630648..af9f4978e50b31 100644 >--- a/drivers/infiniband/hw/qib/qib_init.c >+++ b/drivers/infiniband/hw/qib/qib_init.c >@@ -1123,7 +1123,6 @@ struct qib_devdata *qib_alloc_devdata(struct >pci_dev *pdev, size_t extra) > "Could not allocate unit ID: error %d\n", -ret); > goto bail; > } >- rvt_set_ibdev_name(&dd->verbs_dev.rdi, "%s%d", "qib", dd->unit); > > dd->int_counter = alloc_percpu(u64); > if (!dd->int_counter) { >diff --git a/drivers/infiniband/hw/qib/qib_verbs.c >b/drivers/infiniband/hw/qib/qib_verbs.c >index 41babbc0db583c..9d0ddb42eafe97 100644 >--- a/drivers/infiniband/hw/qib/qib_verbs.c >+++ b/drivers/infiniband/hw/qib/qib_verbs.c >@@ -1524,6 +1524,7 @@ int qib_register_ib_device(struct qib_devdata *dd) > struct qib_ibdev *dev = &dd->verbs_dev; > struct ib_device *ibdev = &dev->rdi.ibdev; > struct qib_pportdata *ppd = dd->pport; >+ char name[IB_DEVICE_NAME_MAX]; > unsigned i, ctxt; > int ret; > >@@ -1643,7 +1644,8 @@ int qib_register_ib_device(struct qib_devdata *dd) > dd->rcd[ctxt]->pkeys); > } > >- ret = rvt_register_device(&dd->verbs_dev.rdi, RDMA_DRIVER_QIB); >+ snprintf(name, sizeof(name), "%s%d", "qib", dd->unit); >+ ret = rvt_register_device(&dd->verbs_dev.rdi, name, >RDMA_DRIVER_QIB); > if (ret) > goto err_tx; > >diff --git a/drivers/infiniband/hw/usnic/usnic_ib_main.c >b/drivers/infiniband/hw/usnic/usnic_ib_main.c >index f0538a460328dd..3b9f12928314fd 100644 >--- a/drivers/infiniband/hw/usnic/usnic_ib_main.c >+++ b/drivers/infiniband/hw/usnic/usnic_ib_main.c >@@ -364,7 +364,6 @@ static void *usnic_ib_device_add(struct pci_dev *dev) > us_ibdev->ib_dev.num_comp_vectors = >USNIC_IB_NUM_COMP_VECTORS; > us_ibdev->ib_dev.dev.parent = &dev->dev; > us_ibdev->ib_dev.uverbs_abi_ver = USNIC_UVERBS_ABI_VERSION; >- strlcpy(us_ibdev->ib_dev.name, "usnic_%d", >IB_DEVICE_NAME_MAX); > > us_ibdev->ib_dev.uverbs_cmd_mask = > (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) | >@@ -416,7 +415,7 @@ static void *usnic_ib_device_add(struct pci_dev *dev) > > > us_ibdev->ib_dev.driver_id = RDMA_DRIVER_USNIC; >- if (ib_register_device(&us_ibdev->ib_dev, NULL)) >+ if (ib_register_device(&us_ibdev->ib_dev, "usnic_%d", NULL)) > goto err_fwd_dealloc; > > usnic_fwd_set_mtu(us_ibdev->ufdev, us_ibdev->netdev->mtu); >diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c >b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c >index a5719899f49ad6..6878107fc637d7 100644 >--- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c >+++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c >@@ -162,7 +162,6 @@ static int pvrdma_register_device(struct pvrdma_dev >*dev) > int ret = -1; > int i = 0; > >- strlcpy(dev->ib_dev.name, "vmw_pvrdma%d", >IB_DEVICE_NAME_MAX); > dev->ib_dev.node_guid = dev->dsr->caps.node_guid; > dev->sys_image_guid = dev->dsr->caps.sys_image_guid; > dev->flags = 0; >@@ -267,7 +266,7 @@ static int pvrdma_register_device(struct pvrdma_dev >*dev) > dev->ib_dev.driver_id = RDMA_DRIVER_VMW_PVRDMA; > spin_lock_init(&dev->srq_tbl_lock); > >- ret = ib_register_device(&dev->ib_dev, NULL); >+ ret = ib_register_device(&dev->ib_dev, "vmw_pvrdma%d", NULL); > if (ret) > goto err_srq_free; > >diff --git a/drivers/infiniband/sw/rdmavt/vt.c >b/drivers/infiniband/sw/rdmavt/vt.c >index 17e4abc067afa3..510ab492d1be57 100644 >--- a/drivers/infiniband/sw/rdmavt/vt.c >+++ b/drivers/infiniband/sw/rdmavt/vt.c >@@ -728,7 +728,8 @@ static noinline int check_support(struct rvt_dev_info >*rdi, int verb) > * > * Return: 0 on success otherwise an errno. > */ >-int rvt_register_device(struct rvt_dev_info *rdi, u32 driver_id) >+int rvt_register_device(struct rvt_dev_info *rdi, const char *name, >+ u32 driver_id) > { > int ret = 0, i; > >@@ -828,7 +829,8 @@ int rvt_register_device(struct rvt_dev_info *rdi, u32 >driver_id) > > rdi->ibdev.driver_id = driver_id; > /* We are now good to announce we exist */ >- ret = ib_register_device(&rdi->ibdev, rdi->driver_f.port_callback); >+ ret = ib_register_device(&rdi->ibdev, name, >+ rdi->driver_f.port_callback); > if (ret) { > rvt_pr_err(rdi, "Failed to register driver with ib core.\n"); > goto bail_mr; >diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c >b/drivers/infiniband/sw/rxe/rxe_verbs.c >index f5b1e0ad614204..e4da5b671e4a21 100644 >--- a/drivers/infiniband/sw/rxe/rxe_verbs.c >+++ b/drivers/infiniband/sw/rxe/rxe_verbs.c >@@ -1159,7 +1159,6 @@ int rxe_register_device(struct rxe_dev *rxe) > struct ib_device *dev = &rxe->ib_dev; > struct crypto_shash *tfm; > >- strlcpy(dev->name, "rxe%d", IB_DEVICE_NAME_MAX); > strlcpy(dev->node_desc, "rxe", sizeof(dev->node_desc)); > > dev->owner = THIS_MODULE; >@@ -1261,7 +1260,7 @@ int rxe_register_device(struct rxe_dev *rxe) > rxe->tfm = tfm; > > dev->driver_id = RDMA_DRIVER_RXE; >- err = ib_register_device(dev, NULL); >+ err = ib_register_device(dev, "rxe%d", NULL); > if (err) { > pr_warn("%s failed with error %d\n", __func__, err); > goto err1; >diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h >index e463d3007a356e..2096e55ff09b63 100644 >--- a/include/rdma/ib_verbs.h >+++ b/include/rdma/ib_verbs.h >@@ -2634,9 +2634,9 @@ void ib_dealloc_device(struct ib_device *device); > > void ib_get_device_fw_str(struct ib_device *device, char *str); > >-int ib_register_device(struct ib_device *device, >- int (*port_callback)(struct ib_device *, >- u8, struct kobject *)); >+int ib_register_device(struct ib_device *device, const char *name, >+ int (*port_callback)(struct ib_device *, u8, >+ struct kobject *)); > void ib_unregister_device(struct ib_device *device); > > int ib_register_client (struct ib_client *client); >diff --git a/include/rdma/rdma_vt.h b/include/rdma/rdma_vt.h >index e32facdd9fd3d0..496f31ac9d8421 100644 >--- a/include/rdma/rdma_vt.h >+++ b/include/rdma/rdma_vt.h >@@ -419,19 +419,6 @@ struct rvt_dev_info { > > }; > >-/** >- * rvt_set_ibdev_name - Craft an IB device name from client info >- * @rdi: pointer to the client rvt_dev_info structure >- * @name: client specific name >- * @unit: client specific unit number. >- */ >-static inline void rvt_set_ibdev_name(struct rvt_dev_info *rdi, >- const char *fmt, const char *name, >- const int unit) >-{ >- snprintf(rdi->ibdev.name, sizeof(rdi->ibdev.name), fmt, name, unit); >-} >- > /** > * rvt_get_ibdev_name - return the IB name > * @rdi: rdmavt device >@@ -545,7 +532,8 @@ static inline void rvt_mod_retry_timer(struct rvt_qp >*qp) > > struct rvt_dev_info *rvt_alloc_device(size_t size, int nports); > void rvt_dealloc_device(struct rvt_dev_info *rdi); >-int rvt_register_device(struct rvt_dev_info *rvd, u32 driver_id); >+int rvt_register_device(struct rvt_dev_info *rvd, const char *name, >+ u32 driver_id); > void rvt_unregister_device(struct rvt_dev_info *rvd); > int rvt_check_ah(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr); > int rvt_init_port(struct rvt_dev_info *rdi, struct rvt_ibport *port, >-- >2.19.0