Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Aug 2018 22:34:48 +0000 (15:34 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Aug 2018 22:34:48 +0000 (15:34 -0700)
Pull more rdma updates from Jason Gunthorpe:
 "This is the SMC cleanup promised, a randconfig regression fix, and
  kernel oops fix.

  Summary:

   - Switch SMC over to rdma_get_gid_attr and remove the compat

   - Fix a crash in HFI1 with some BIOS's

   - Fix a randconfig failure"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma:
  IB/ucm: fix UCM link error
  IB/hfi1: Invalid NUMA node information can cause a divide by zero
  RDMA/smc: Replace ib_query_gid with rdma_get_gid_attr

drivers/infiniband/Kconfig
drivers/infiniband/hw/hfi1/affinity.c
include/rdma/ib_cache.h
net/smc/smc_ib.c

index d160d2d1f3a3fbe1b18ddf5a8d26ec7d74e8df2f..abb6660c099c9f44767c1f2aad27730658fba28d 100644 (file)
@@ -36,7 +36,7 @@ config INFINIBAND_USER_ACCESS
          rdma-core <https://github.com/linux-rdma/rdma-core>.
 
 config INFINIBAND_USER_ACCESS_UCM
-       bool "Userspace CM (UCM, DEPRECATED)"
+       tristate "Userspace CM (UCM, DEPRECATED)"
        depends on BROKEN || COMPILE_TEST
        depends on INFINIBAND_USER_ACCESS
        help
index fbe7198a715a1278f0b2c7068d8a740177f50253..bedd5fba33b080a075405c9a01fa8006f5b0a3f2 100644 (file)
@@ -198,7 +198,7 @@ int node_affinity_init(void)
                while ((dev = pci_get_device(ids->vendor, ids->device, dev))) {
                        node = pcibus_to_node(dev->bus);
                        if (node < 0)
-                               node = numa_node_id();
+                               goto out;
 
                        hfi1_per_node_cntr[node]++;
                }
@@ -206,6 +206,18 @@ int node_affinity_init(void)
        }
 
        return 0;
+
+out:
+       /*
+        * Invalid PCI NUMA node information found, note it, and populate
+        * our database 1:1.
+        */
+       pr_err("HFI: Invalid PCI NUMA node. Performance may be affected\n");
+       pr_err("HFI: System BIOS may need to be upgraded\n");
+       for (node = 0; node < node_affinity.num_possible_nodes; node++)
+               hfi1_per_node_cntr[node] = 1;
+
+       return 0;
 }
 
 static void node_affinity_destroy(struct hfi1_affinity_node *entry)
@@ -622,8 +634,14 @@ int hfi1_dev_affinity_init(struct hfi1_devdata *dd)
        int curr_cpu, possible, i, ret;
        bool new_entry = false;
 
-       if (node < 0)
-               node = numa_node_id();
+       /*
+        * If the BIOS does not have the NUMA node information set, select
+        * NUMA 0 so we get consistent performance.
+        */
+       if (node < 0) {
+               dd_dev_err(dd, "Invalid PCI NUMA node. Performance may be affected\n");
+               node = 0;
+       }
        dd->node = node;
 
        local_mask = cpumask_of_node(dd->node);
index 3e11e7cc60b7457befa97bc8f589a23ad0ef1457..62e990b620aaf7c17f54f696c1390dbc60c4c8bd 100644 (file)
@@ -133,28 +133,4 @@ const struct ib_gid_attr *rdma_get_gid_attr(struct ib_device *device,
 void rdma_put_gid_attr(const struct ib_gid_attr *attr);
 void rdma_hold_gid_attr(const struct ib_gid_attr *attr);
 
-/*
- * This is to be removed. It only exists to make merging rdma and smc simpler.
- */
-static inline __deprecated int ib_query_gid(struct ib_device *device,
-                                           u8 port_num, int index,
-                                           union ib_gid *gid,
-                                           struct ib_gid_attr *attr_out)
-{
-       const struct ib_gid_attr *attr;
-
-       memset(attr_out, 0, sizeof(*attr_out));
-       attr = rdma_get_gid_attr(device, port_num, index);
-       if (IS_ERR(attr))
-               return PTR_ERR(attr);
-
-       if (attr->ndev)
-               dev_hold(attr->ndev);
-       *attr_out = *attr;
-
-       rdma_put_gid_attr(attr);
-
-       return 0;
-}
-
 #endif /* _IB_CACHE_H */
index 9bb5274a244e83e577617cb1ce71dc9c44d4d980..e519ef29c0ffcb74baf25753a58048504fedd813 100644 (file)
@@ -145,17 +145,21 @@ out:
 
 static int smc_ib_fill_mac(struct smc_ib_device *smcibdev, u8 ibport)
 {
-       struct ib_gid_attr gattr;
-       union ib_gid gid;
-       int rc;
+       const struct ib_gid_attr *attr;
+       int rc = 0;
 
-       rc = ib_query_gid(smcibdev->ibdev, ibport, 0, &gid, &gattr);
-       if (rc || !gattr.ndev)
+       attr = rdma_get_gid_attr(smcibdev->ibdev, ibport, 0);
+       if (IS_ERR(attr))
                return -ENODEV;
 
-       memcpy(smcibdev->mac[ibport - 1], gattr.ndev->dev_addr, ETH_ALEN);
-       dev_put(gattr.ndev);
-       return 0;
+       if (attr->ndev)
+               memcpy(smcibdev->mac[ibport - 1], attr->ndev->dev_addr,
+                      ETH_ALEN);
+       else
+               rc = -ENODEV;
+
+       rdma_put_gid_attr(attr);
+       return rc;
 }
 
 /* Create an identifier unique for this instance of SMC-R.
@@ -180,29 +184,27 @@ bool smc_ib_port_active(struct smc_ib_device *smcibdev, u8 ibport)
 int smc_ib_determine_gid(struct smc_ib_device *smcibdev, u8 ibport,
                         unsigned short vlan_id, u8 gid[], u8 *sgid_index)
 {
-       struct ib_gid_attr gattr;
-       union ib_gid _gid;
+       const struct ib_gid_attr *attr;
        int i;
 
        for (i = 0; i < smcibdev->pattr[ibport - 1].gid_tbl_len; i++) {
-               memset(&_gid, 0, SMC_GID_SIZE);
-               memset(&gattr, 0, sizeof(gattr));
-               if (ib_query_gid(smcibdev->ibdev, ibport, i, &_gid, &gattr))
+               attr = rdma_get_gid_attr(smcibdev->ibdev, ibport, i);
+               if (IS_ERR(attr))
                        continue;
-               if (!gattr.ndev)
-                       continue;
-               if (((!vlan_id && !is_vlan_dev(gattr.ndev)) ||
-                    (vlan_id && is_vlan_dev(gattr.ndev) &&
-                     vlan_dev_vlan_id(gattr.ndev) == vlan_id)) &&
-                   gattr.gid_type == IB_GID_TYPE_IB) {
+
+               if (attr->ndev &&
+                   ((!vlan_id && !is_vlan_dev(attr->ndev)) ||
+                    (vlan_id && is_vlan_dev(attr->ndev) &&
+                     vlan_dev_vlan_id(attr->ndev) == vlan_id)) &&
+                   attr->gid_type == IB_GID_TYPE_ROCE) {
                        if (gid)
-                               memcpy(gid, &_gid, SMC_GID_SIZE);
+                               memcpy(gid, &attr->gid, SMC_GID_SIZE);
                        if (sgid_index)
-                               *sgid_index = i;
-                       dev_put(gattr.ndev);
+                               *sgid_index = attr->index;
+                       rdma_put_gid_attr(attr);
                        return 0;
                }
-               dev_put(gattr.ndev);
+               rdma_put_gid_attr(attr);
        }
        return -ENODEV;
 }