From: Vladimir Koushnir <vladimirk@xxxxxxxxxxxx> Date: Sun, 26 Apr 2015 12:24:06 +0300 Global file descriptor for SMPs and GMPs should be closed before running ibnd_discover_fabric() to avoid parallel usage of two SMP file descriptors Signed-off-by: Vladimir Koushnir <vladimirk@xxxxxxxxxxxx> Signed-off-by: Hal Rosenstock <hal@xxxxxxxxxxxx> --- Changes since v1: Fixed direct route (-D) option diff --git a/src/ibqueryerrors.c b/src/ibqueryerrors.c index 06fcbac..80436d3 100644 --- a/src/ibqueryerrors.c +++ b/src/ibqueryerrors.c @@ -1000,18 +1002,20 @@ int main(int argc, char **argv) config.flags = ibd_ibnetdisc_flags; config.mkey = ibd_mkey; - node_name_map = open_node_name_map(node_name_map_file); - if (dr_path && load_cache_file) { + mad_rpc_close_port(ibmad_port); fprintf(stderr, "Cannot specify cache and direct route path\n"); exit(-1); } if (resolve_self(ibd_ca, ibd_ca_port, &self_portid, &port, &self_gid.raw) < 0) { + mad_rpc_close_port(ibmad_port); IBEXIT("can't resolve self port %s", argv[0]); goto close_port; } + node_name_map = open_node_name_map(node_name_map_file); + /* limit the scan the fabric around the target */ if (dr_path) { if ((resolved = @@ -1030,10 +1034,13 @@ int main(int argc, char **argv) lid2sl_table[portid.lid] = portid.sl; } + mad_rpc_close_port(ibmad_port); + if (load_cache_file) { if ((fabric = ibnd_load_fabric(load_cache_file, 0)) == NULL) { fprintf(stderr, "loading cached fabric failed\n"); - exit(-1); + rc = -1; + goto close_port; } } else { if (resolved >= 0) { @@ -1057,6 +1064,21 @@ int main(int argc, char **argv) set_thresholds(threshold_file); + /* reopen the global ibmad_port */ + ibmad_port = mad_rpc_open_port(ibd_ca, ibd_ca_port, + mgmt_classes, 4); + if (!ibmad_port) { + ibnd_destroy_fabric(fabric); + close_node_name_map(node_name_map); + IBEXIT("Failed to reopen port: %s:%d\n", + ibd_ca, ibd_ca_port); + } + + smp_mkey_set(ibmad_port, ibd_mkey); + + if (ibd_timeout) + mad_rpc_set_timeout(ibmad_port, ibd_timeout); + if (port_guid_str) { ibnd_port_t *port = ibnd_find_port_guid(fabric, port_guid); if (port) @@ -1067,12 +1089,12 @@ int main(int argc, char **argv) } else if (dr_path) { ibnd_port_t *port = ibnd_find_port_dr(fabric, dr_path); uint8_t ni[IB_SMP_DATA_SIZE] = { 0 }; - if (!smp_query_via(ni, &portid, IB_ATTR_NODE_INFO, 0, - ibd_timeout, ibmad_port)) { - rc = -1; - goto destroy_fabric; + ibd_timeout, ibmad_port)) { + fprintf(stderr, "Failed to query local Node Info\n"); + goto destroy_fabric; } + mad_decode_field(ni, IB_NODE_PORT_GUID_F, &(port_guid)); port = ibnd_find_port_guid(fabric, port_guid); @@ -1087,6 +1109,7 @@ int main(int argc, char **argv) if(obtain_sl) if(path_record_query(self_gid,0)) goto destroy_fabric; + ibnd_iter_nodes(fabric, print_node, NULL); } @@ -1095,10 +1118,10 @@ int main(int argc, char **argv) rc = 1; destroy_fabric: + mad_rpc_close_port(ibmad_port); ibnd_destroy_fabric(fabric); close_port: - mad_rpc_close_port(ibmad_port); close_node_name_map(node_name_map); exit(rc); } -- 1.7.8.2 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html