IB/{rdmavt, hfi1, qib}: Self determine driver name
authorMichael J. Ruhl <michael.j.ruhl@intel.com>
Tue, 19 Dec 2017 03:56:37 +0000 (19:56 -0800)
committerDoug Ledford <dledford@redhat.com>
Fri, 5 Jan 2018 18:34:55 +0000 (13:34 -0500)
Currently the HFI and QIB drivers allow the IB core to assign a unit
number to the driver name string.

If multiple devices exist in a system, there is a possibility that the
device unit number and the IB core number will be mismatched.

Fix by using the driver defined unit number to generate the device
name.

Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/init.c
drivers/infiniband/hw/hfi1/verbs.c
drivers/infiniband/hw/qib/qib_init.c
drivers/infiniband/hw/qib/qib_verbs.c
include/rdma/rdma_vt.h

index 8e3b3e7..9b12826 100644 (file)
@@ -1272,6 +1272,8 @@ struct hfi1_devdata *hfi1_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", class_name(), dd->unit);
+
        /*
         * Initialize all locks for the device. This needs to be as early as
         * possible so locks are usable.
index 6d27c85..4e68e3f 100644 (file)
@@ -1844,7 +1844,6 @@ int hfi1_register_ib_device(struct hfi1_devdata *dd)
        struct hfi1_ibport *ibp = &ppd->ibport_data;
        unsigned i;
        int ret;
-       size_t lcpysz = IB_DEVICE_NAME_MAX;
 
        for (i = 0; i < dd->num_pports; i++)
                init_ibport(ppd + i);
@@ -1872,8 +1871,6 @@ int hfi1_register_ib_device(struct hfi1_devdata *dd)
         */
        if (!ib_hfi1_sys_image_guid)
                ib_hfi1_sys_image_guid = ibdev->node_guid;
-       lcpysz = strlcpy(ibdev->name, class_name(), lcpysz);
-       strlcpy(ibdev->name + lcpysz, "_%d", IB_DEVICE_NAME_MAX - lcpysz);
        ibdev->owner = THIS_MODULE;
        ibdev->phys_port_cnt = dd->num_pports;
        ibdev->dev.parent = &dd->pcidev->dev;
index 85dfbba..3990f38 100644 (file)
@@ -1119,6 +1119,8 @@ 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) {
                ret = -ENOMEM;
index c550005..373b80b 100644 (file)
@@ -1571,7 +1571,6 @@ int qib_register_ib_device(struct qib_devdata *dd)
        if (!ib_qib_sys_image_guid)
                ib_qib_sys_image_guid = ppd->guid;
 
-       strlcpy(ibdev->name, "qib%d", IB_DEVICE_NAME_MAX);
        ibdev->owner = THIS_MODULE;
        ibdev->node_guid = ppd->guid;
        ibdev->phys_port_cnt = dd->num_pports;
index 1ba84a7..b57784e 100644 (file)
@@ -419,6 +419,19 @@ 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);
+}
+
 static inline struct rvt_pd *ibpd_to_rvtpd(struct ib_pd *ibpd)
 {
        return container_of(ibpd, struct rvt_pd, ibpd);