Blame SOURCES/0006-ibacm-only-open-InfiniBand-port.patch

96ca5f
From 52d1c4346e17454cee315e8c3027dc0cb4779dc0 Mon Sep 17 00:00:00 2001
96ca5f
From: Honggang Li <honli@redhat.com>
96ca5f
Date: Tue, 11 Jun 2019 19:33:25 -0400
96ca5f
Subject: [PATCH rdma-core] ibacm: only open InfiniBand port
96ca5f
MIME-Version: 1.0
96ca5f
Content-Type: text/plain; charset=UTF-8
96ca5f
Content-Transfer-Encoding: 8bit
96ca5f
96ca5f
The low 64 bits of cxgb3 and cxgb4 devices' GID are zeros. If the
96ca5f
"provider" was set in the option file, ibacm will fail with segment fault.
96ca5f
96ca5f
$ sed -i -e 's/# provider ibacmp 0xFE80000000000000/provider ibacmp 0xFE80000000000000/g' /etc/rdma/ibacm_opts.cfg
96ca5f
$ /usr/sbin/ibacm --systemd
96ca5f
Segmentation fault (core dumped)
96ca5f
$ gdb /usr/sbin/ibacm core.ibacm
96ca5f
(gdb) bt
96ca5f
0  0x00005625a4809217 in acm_assign_provider (port=0x5625a4bc6f28) at /usr/src/debug/rdma-core-25.0-1.el8.x86_64/ibacm/src/acm.c:2285
96ca5f
1  acm_port_up (port=0x5625a4bc6f28) at /usr/src/debug/rdma-core-25.0-1.el8.x86_64/ibacm/src/acm.c:2372
96ca5f
2  0x00005625a48073d2 in acm_activate_devices () at /usr/src/debug/rdma-core-25.0-1.el8.x86_64/ibacm/src/acm.c:2564
96ca5f
3  main (argc=<optimized out>, argv=<optimized out>) at /usr/src/debug/rdma-core-25.0-1.el8.x86_64/ibacm/src/acm.c:3270
96ca5f
96ca5f
Note: The rpm was built with tarball generated from upstream repo. The last
96ca5f
commit is aa41a65ec86bdb9c1c86e57885ee588b39558238.
96ca5f
96ca5f
acm_open_dev function should not open a umad port for iWARP or RoCE
96ca5f
devices.
96ca5f
96ca5f
Signed-off-by: Honggang Li <honli@redhat.com>
96ca5f
Reviewed-by: HÃ¥kon Bugge <haakon.bugge@oracle.com>
96ca5f
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
96ca5f
---
96ca5f
 ibacm/src/acm.c | 26 ++++++++++++++++++++++----
96ca5f
 1 file changed, 22 insertions(+), 4 deletions(-)
96ca5f
96ca5f
diff --git a/ibacm/src/acm.c b/ibacm/src/acm.c
96ca5f
index 37dec065..46d33ba2 100644
96ca5f
--- a/ibacm/src/acm.c
96ca5f
+++ b/ibacm/src/acm.c
96ca5f
@@ -2589,9 +2589,11 @@ static void acm_open_dev(struct ibv_device *ibdev)
96ca5f
 {
96ca5f
 	struct acmc_device *dev;
96ca5f
 	struct ibv_device_attr attr;
96ca5f
+	struct ibv_port_attr port_attr;
96ca5f
 	struct ibv_context *verbs;
96ca5f
 	size_t size;
96ca5f
 	int i, ret;
96ca5f
+	unsigned int opened_ib_port_cnt = 0;
96ca5f
 
96ca5f
 	acm_log(1, "%s\n", ibdev->name);
96ca5f
 	verbs = ibv_open_device(ibdev);
96ca5f
@@ -2617,13 +2619,29 @@ static void acm_open_dev(struct ibv_device *ibdev)
96ca5f
 	list_head_init(&dev->prov_dev_context_list);
96ca5f
 
96ca5f
 	for (i = 0; i < dev->port_cnt; i++) {
96ca5f
+		acm_log(1, "%s port %d\n", ibdev->name, i + 1);
96ca5f
+		ret = ibv_query_port(dev->device.verbs, i + 1, &port_attr);
96ca5f
+		if (ret) {
96ca5f
+			acm_log(0, "ERROR - ibv_query_port (%d)\n", ret);
96ca5f
+			continue;
96ca5f
+		}
96ca5f
+		if (port_attr.link_layer != IBV_LINK_LAYER_INFINIBAND) {
96ca5f
+			acm_log(1, "not an InfiniBand port\n");
96ca5f
+			continue;
96ca5f
+		}
96ca5f
+
96ca5f
 		acm_open_port(&dev->port[i], dev, i + 1);
96ca5f
+		opened_ib_port_cnt++;
96ca5f
 	}
96ca5f
 
96ca5f
-	list_add(&dev_list, &dev->entry);
96ca5f
-
96ca5f
-	acm_log(1, "%s opened\n", ibdev->name);
96ca5f
-	return;
96ca5f
+	if (opened_ib_port_cnt) {
96ca5f
+		list_add(&dev_list, &dev->entry);
96ca5f
+		acm_log(1, "%d InfiniBand %s opened for %s\n",
96ca5f
+				opened_ib_port_cnt,
96ca5f
+				opened_ib_port_cnt == 1 ? "port" : "ports",
96ca5f
+				ibdev->name);
96ca5f
+		return;
96ca5f
+	}
96ca5f
 
96ca5f
 err1:
96ca5f
 	ibv_close_device(verbs);
96ca5f
-- 
96ca5f
2.20.1
96ca5f