Skip to content

Commit

Permalink
ibacm: only open InfiniBand port
Browse files Browse the repository at this point in the history
The low 64 bits of cxgb3 and cxgb4 devices' GID are zeros. If the
"provider" was set in the option file, ibacm will fail with segment fault.

$ sed -i -e 's/# provider ibacmp 0xFE80000000000000/provider ibacmp 0xFE80000000000000/g' /etc/rdma/ibacm_opts.cfg
$ /usr/sbin/ibacm --systemd
Segmentation fault (core dumped)
$ gdb /usr/sbin/ibacm core.ibacm
(gdb) bt
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
1  acm_port_up (port=0x5625a4bc6f28) at /usr/src/debug/rdma-core-25.0-1.el8.x86_64/ibacm/src/acm.c:2372
2  0x00005625a48073d2 in acm_activate_devices () at /usr/src/debug/rdma-core-25.0-1.el8.x86_64/ibacm/src/acm.c:2564
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

Note: The rpm was built with tarball generated from upstream repo. The last
commit is aa41a65.

acm_open_dev function should not open a umad port for iWARP or RoCE
devices.

Signed-off-by: Honggang Li <[email protected]>
Reviewed-by: Håkon Bugge <[email protected]>
Signed-off-by: Jason Gunthorpe <[email protected]>
  • Loading branch information
Honggang-LI authored and jgunthorpe committed Jun 19, 2019
1 parent f7eedfe commit e9ffc0b
Showing 1 changed file with 22 additions and 4 deletions.
26 changes: 22 additions & 4 deletions ibacm/src/acm.c
Original file line number Diff line number Diff line change
Expand Up @@ -2600,9 +2600,11 @@ static void acm_open_dev(struct ibv_device *ibdev)
{
struct acmc_device *dev;
struct ibv_device_attr attr;
struct ibv_port_attr port_attr;
struct ibv_context *verbs;
size_t size;
int i, ret;
unsigned int opened_ib_port_cnt = 0;

acm_log(1, "%s\n", ibdev->name);
verbs = ibv_open_device(ibdev);
Expand All @@ -2628,13 +2630,29 @@ static void acm_open_dev(struct ibv_device *ibdev)
list_head_init(&dev->prov_dev_context_list);

for (i = 0; i < dev->port_cnt; i++) {
acm_log(1, "%s port %d\n", ibdev->name, i + 1);
ret = ibv_query_port(dev->device.verbs, i + 1, &port_attr);
if (ret) {
acm_log(0, "ERROR - ibv_query_port (%d)\n", ret);
continue;
}
if (port_attr.link_layer != IBV_LINK_LAYER_INFINIBAND) {
acm_log(1, "not an InfiniBand port\n");
continue;
}

acm_open_port(&dev->port[i], dev, i + 1);
opened_ib_port_cnt++;
}

list_add(&dev_list, &dev->entry);

acm_log(1, "%s opened\n", ibdev->name);
return;
if (opened_ib_port_cnt) {
list_add(&dev_list, &dev->entry);
acm_log(1, "%d InfiniBand %s opened for %s\n",
opened_ib_port_cnt,
opened_ib_port_cnt == 1 ? "port" : "ports",
ibdev->name);
return;
}

err1:
ibv_close_device(verbs);
Expand Down

0 comments on commit e9ffc0b

Please sign in to comment.