Since these macros exit, now need to call mad_rpc_close_port prior to invoking them
Also, some cosmetic formatting changes Signed-off-by: Hal Rosenstock <[email protected]> --- diff --git a/infiniband-diags/src/grouping.c b/infiniband-diags/src/grouping.c index 0c30726..24c33ad 100644 --- a/infiniband-diags/src/grouping.c +++ b/infiniband-diags/src/grouping.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2004-2007 Voltaire Inc. All rights reserved. * Copyright (c) 2007 Xsigo Systems Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -55,6 +56,7 @@ extern Node *nodesdist[MAXHOPS+1]; /* last is CA list */ extern Node *mynode; extern Port *myport; extern int maxhops_discovered; +extern struct ibmad_port *srcport; AllChassisList mylist; @@ -302,7 +304,9 @@ static void get_sfb_slot(Node *node, Port *lineport) ch->slotnum = spine4_slot_2_slb[lineport->portnum]; ch->anafanum = anafa_spine4_slot_2_slb[lineport->portnum]; } else { - IBPANIC("Unexpected node found: guid 0x%016" PRIx64, node->nodeguid); + mad_rpc_close_port(srcport); + IBPANIC("Unexpected node found: guid 0x%016" PRIx64, + node->nodeguid); } } @@ -312,8 +316,10 @@ static void get_router_slot(Node *node, Port *spineport) uint64_t guessnum = 0; if (!ch) { - if (!(node->chrecord = calloc(1, sizeof(ChassisRecord)))) + if (!(node->chrecord = calloc(1, sizeof(ChassisRecord)))) { + mad_rpc_close_port(srcport); IBPANIC("out of mem"); + } ch = node->chrecord; } @@ -345,7 +351,9 @@ static void get_router_slot(Node *node, Port *spineport) ch->slotnum = line_slot_2_sfb4[spineport->portnum]; ch->anafanum = ipr_slot_2_sfb4_port[spineport->portnum]; } else { - IBPANIC("Unexpected node found: guid 0x%016" PRIx64, spineport->node->nodeguid); + mad_rpc_close_port(srcport); + IBPANIC("Unexpected node found: guid 0x%016" PRIx64, + spineport->node->nodeguid); } } @@ -369,7 +377,9 @@ static void get_slb_slot(ChassisRecord *ch, Port *spineport) ch->slotnum = line_slot_2_sfb4[spineport->portnum]; ch->anafanum = anafa_line_slot_2_sfb4[spineport->portnum]; } else { - IBPANIC("Unexpected node found: guid 0x%016" PRIx64, spineport->node->nodeguid); + mad_rpc_close_port(srcport); + IBPANIC("Unexpected node found: guid 0x%016" PRIx64, + spineport->node->nodeguid); } } @@ -387,8 +397,10 @@ static void fill_chassis_record(Node *node) if (node->chrecord) /* somehow this node has already been passed */ return; - if (!(node->chrecord = calloc(1, sizeof(ChassisRecord)))) + if (!(node->chrecord = calloc(1, sizeof(ChassisRecord)))) { + mad_rpc_close_port(srcport); IBPANIC("out of mem"); + } ch = node->chrecord; @@ -433,8 +445,10 @@ static int get_line_index(Node *node) { int retval = 3 * (node->chrecord->slotnum - 1) + node->chrecord->anafanum; - if (retval > LINES_MAX_NUM || retval < 1) + if (retval > LINES_MAX_NUM || retval < 1) { + mad_rpc_close_port(srcport); IBPANIC("Internal error"); + } return retval; } @@ -447,8 +461,10 @@ static int get_spine_index(Node *node) else retval = node->chrecord->slotnum; - if (retval > SPINES_MAX_NUM || retval < 1) + if (retval > SPINES_MAX_NUM || retval < 1) { + mad_rpc_close_port(srcport); IBPANIC("Internal error"); + } return retval; } @@ -677,8 +693,10 @@ char *portmapstring(Port *port) static void add_chassislist() { - if (!(mylist.current = calloc(1, sizeof(ChassisList)))) + if (!(mylist.current = calloc(1, sizeof(ChassisList)))) { + mad_rpc_close_port(srcport); IBPANIC("out of mem"); + } if (mylist.first == NULL) { mylist.first = mylist.current; @@ -768,8 +786,10 @@ ChassisList *group_nodes() if (!chassis->chassisnum) chassis->chassisnum = ++chassisnum; if (!node->chrecord) { - if (!(node->chrecord = calloc(1, sizeof(ChassisRecord)))) + if (!(node->chrecord = calloc(1, sizeof(ChassisRecord)))) { + mad_rpc_close_port(srcport); IBPANIC("out of mem"); + } node->chrecord->chassisnum = chassis->chassisnum; } } diff --git a/infiniband-diags/src/ibaddr.c b/infiniband-diags/src/ibaddr.c index bb22be9..99bd33f 100644 --- a/infiniband-diags/src/ibaddr.c +++ b/infiniband-diags/src/ibaddr.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -145,15 +146,21 @@ int main(int argc, char **argv) if (argc) { if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", argv[0]); + } } else { - if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0) + if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve self port %s", argv[0]); + } } - if (ib_resolve_addr(&portid, port, show_lid, show_gid) < 0) + if (ib_resolve_addr(&portid, port, show_lid, show_gid) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve requested address"); + } mad_rpc_close_port(srcport); exit(0); diff --git a/infiniband-diags/src/ibnetdiscover.c b/infiniband-diags/src/ibnetdiscover.c index 25c1f7f..ecb2956 100644 --- a/infiniband-diags/src/ibnetdiscover.c +++ b/infiniband-diags/src/ibnetdiscover.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. * Copyright (c) 2007 Xsigo Systems Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -136,7 +137,6 @@ decode_port_info(void *pi, Port *port) mad_decode_field(pi, IB_PORT_LINK_SPEED_ACTIVE_F, &port->linkspeed); } - int get_port(Port *port, int portnum, ib_portid_t *portid) { @@ -146,12 +146,14 @@ get_port(Port *port, int portnum, ib_portid_t *portid) port->portnum = portnum; if (!smp_query_via(pi, portid, IB_ATTR_PORT_INFO, portnum, timeout, - srcport)) + srcport)) return -1; decode_port_info(pi, port); DEBUG("portid %s portnum %d: lid %d state %d physstate %d %s %s", - portid2str(portid), portnum, port->lid, port->state, port->physstate, get_linkwidth_str(port->linkwidth), get_linkspeed_str(port->linkspeed)); + portid2str(portid), portnum, port->lid, port->state, + port->physstate, get_linkwidth_str(port->linkwidth), + get_linkspeed_str(port->linkspeed)); return 1; } /* @@ -314,8 +316,8 @@ static void link_ports(Node *node, Port *port, Node *remotenode, Port *remoteport) { DEBUG("linking: 0x%" PRIx64 " %p->%p:%u and 0x%" PRIx64 " %p->%p:%u", - node->nodeguid, node, port, port->portnum, - remotenode->nodeguid, remotenode, remoteport, remoteport->portnum); + node->nodeguid, node, port, port->portnum, + remotenode->nodeguid, remotenode, remoteport, remoteport->portnum); if (port->remoteport) port->remoteport->remoteport = NULL; if (remoteport->remoteport) @@ -352,16 +354,20 @@ handle_port(Node *node, Port *port, ib_portid_t *path, int portnum, int dist) oldnode = find_node(&node_buf); if (oldnode) remotenode = oldnode; - else if (!(remotenode = create_node(&node_buf, path, dist + 1))) + else if (!(remotenode = create_node(&node_buf, path, dist + 1))) { + mad_rpc_close_port(srcport); IBERROR("no memory"); + } oldport = find_port(remotenode, &port_buf); if (oldport) { remoteport = oldport; if (node != remotenode || port != remoteport) IBWARN("port moving..."); - } else if (!(remoteport = create_port(remotenode, &port_buf))) + } else if (!(remoteport = create_port(remotenode, &port_buf))) { + mad_rpc_close_port(srcport); IBERROR("no memory"); + } dump_endnode(path, oldnode ? "known remote" : "new remote", remotenode, remoteport); @@ -397,14 +403,18 @@ discover(ib_portid_t *from) } node = create_node(&node_buf, from, 0); - if (!node) + if (!node) { + mad_rpc_close_port(srcport); IBERROR("out of memory"); + } mynode = node; port = create_port(node, &port_buf); - if (!port) + if (!port) { + mad_rpc_close_port(srcport); IBERROR("out of memory"); + } if (node->type != SWITCH_NODE && handle_port(node, port, from, node->localport, 0) < 0) @@ -424,7 +434,8 @@ discover(ib_portid_t *from) continue; if (get_port(&port_buf, i, path) < 0) { - IBWARN("can't reach node %s port %d", portid2str(path), i); + IBWARN("can't reach node %s port %d", + portid2str(path), i); continue; } @@ -433,8 +444,10 @@ discover(ib_portid_t *from) continue; port = create_port(node, &port_buf); - if (!port) + if (!port) { + mad_rpc_close_port(srcport); IBERROR("out of memory"); + } /* If switch, set port GUID to node GUID */ if (node->type == SWITCH_NODE) @@ -477,7 +490,7 @@ list_node(Node *node) { char *node_type; char *nodename = remap_node_name(node_name_map, node->nodeguid, - node->nodedesc); + node->nodedesc); switch(node->type) { case SWITCH_NODE: @@ -494,9 +507,8 @@ list_node(Node *node) break; } fprintf(f, "%s\t : 0x%016" PRIx64 " ports %d devid 0x%x vendid 0x%x \"%s\"\n", - node_type, - node->nodeguid, node->numports, node->devid, node->vendid, - nodename); + node_type, node->nodeguid, node->numports, node->devid, + node->vendid, nodename); free(nodename); } @@ -550,15 +562,15 @@ out_switch(Node *node, int group, char *chname) str = get_chassis_slot(node->chrecord->chassisslot); if (str) fprintf(f, "%s ", str); - fprintf(f, "%d Chip %d", node->chrecord->slotnum, node->chrecord->anafanum); + fprintf(f, "%d Chip %d", node->chrecord->slotnum, + node->chrecord->anafanum); } nodename = remap_node_name(node_name_map, node->nodeguid, - node->nodedesc); + node->nodedesc); fprintf(f, "\nSwitch\t%d %s\t\t# \"%s\" %s port 0 lid %d lmc %d\n", - node->numports, node_name(node), - nodename, + node->numports, node_name(node), nodename, node->smaenhsp0 ? "enhanced" : "base", node->smalid, node->smalmc); @@ -571,7 +583,7 @@ out_ca(Node *node, int group, char *chname) char *node_type; char *node_type2; char *nodename = remap_node_name(node_name_map, node->nodeguid, - node->nodedesc); + node->nodedesc); out_ids(node, group, chname); switch(node->type) { @@ -591,8 +603,7 @@ out_ca(Node *node, int group, char *chname) fprintf(f, "%sguid=0x%" PRIx64 "\n", node_type, node->nodeguid); fprintf(f, "%s\t%d %s\t\t# \"%s\"", - node_type2, node->numports, node_name(node), - nodename); + node_type2, node->numports, node_name(node), nodename); if (group && is_xsigo_hca(node->nodeguid)) fprintf(f, " (scp)"); fprintf(f, "\n"); @@ -627,8 +638,8 @@ out_switch_port(Port *port, int group) fprintf(f, "%s", ext_port_str); rem_nodename = remap_node_name(node_name_map, - port->remoteport->node->nodeguid, - port->remoteport->node->nodedesc); + port->remoteport->node->nodeguid, + port->remoteport->node->nodedesc); ext_port_str = out_ext_port(port->remoteport, group); fprintf(f, "\t%s[%d]%s", @@ -671,8 +682,8 @@ out_ca_port(Port *port, int group) fprintf(f, " (%" PRIx64 ") ", port->remoteport->portguid); rem_nodename = remap_node_name(node_name_map, - port->remoteport->node->nodeguid, - port->remoteport->node->nodedesc); + port->remoteport->node->nodeguid, + port->remoteport->node->nodedesc); fprintf(f, "\t\t# lid %d lmc %d \"%s\" lid %d %s%s\n", port->lid, port->lmc, rem_nodename, @@ -696,7 +707,8 @@ dump_topology(int listtype, int group) if (!listtype) { fprintf(f, "#\n# Topology file: generated on %s#\n", ctime(&t)); fprintf(f, "# Max of %d hops discovered\n", maxhops_discovered); - fprintf(f, "# Initiated from node %016" PRIx64 " port %016" PRIx64 "\n", mynode->nodeguid, mynode->portguid); + fprintf(f, "# Initiated from node %016" PRIx64 " port %016" PRIx64 "\n", + mynode->nodeguid, mynode->portguid); } /* Make pass on switches */ @@ -1007,8 +1019,10 @@ int main(int argc, char **argv) node_name_map = open_node_name_map(node_name_map_file); - if (discover(&my_portid) < 0) + if (discover(&my_portid) < 0) { + mad_rpc_close_port(srcport); IBERROR("discover"); + } if (group) chassis = group_nodes(); diff --git a/infiniband-diags/src/ibping.c b/infiniband-diags/src/ibping.c index 901079f..fb9772c 100644 --- a/infiniband-diags/src/ibping.c +++ b/infiniband-diags/src/ibping.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -215,22 +216,31 @@ int main(int argc, char **argv) IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); if (server) { - if (mad_register_server_via(ping_class, 0, 0, oui, srcport) < 0) + if (mad_register_server_via(ping_class, 0, 0, oui, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't serve class %d on this port", ping_class); + } get_host_and_domain(host_and_domain, sizeof host_and_domain); - if ((err = ibping_serv())) + if ((err = ibping_serv())) { + mad_rpc_close_port(srcport); IBERROR("ibping to %s: %s", portid2str(&portid), err); + } + mad_rpc_close_port(srcport); exit(0); } - if (mad_register_client_via(ping_class, 0, srcport) < 0) + if (mad_register_client_via(ping_class, 0, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't register ping class %d on this port", ping_class); + } if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", argv[0]); + } signal(SIGINT, report); signal(SIGTERM, report); diff --git a/infiniband-diags/src/ibportstate.c b/infiniband-diags/src/ibportstate.c index 65c9ca1..c23ce84 100644 --- a/infiniband-diags/src/ibportstate.c +++ b/infiniband-diags/src/ibportstate.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -230,8 +231,10 @@ int main(int argc, char **argv) IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", argv[0]); + } /* First, make sure it is a switch port if it is a "set" */ if (argc >= 3) { @@ -242,24 +245,32 @@ int main(int argc, char **argv) else if (!strcmp(argv[2], "reset")) port_op = 3; else if (!strcmp(argv[2], "speed")) { - if (argc < 4) + if (argc < 4) { + mad_rpc_close_port(srcport); IBERROR("speed requires an additional parameter"); + } port_op = 4; /* Parse speed value */ speed = strtoul(argv[3], 0, 0); - if (speed > 15) + if (speed > 15) { + mad_rpc_close_port(srcport); IBERROR("invalid speed value %d", speed); + } } } err = get_node_info(&portid, data); - if (err < 0) + if (err < 0) { + mad_rpc_close_port(srcport); IBERROR("smp query nodeinfo failed"); + } if (err) { /* not switch */ if (port_op == 0) /* query op */ is_switch = 0; - else if (port_op != 4) /* other than speed op */ + else if (port_op != 4) { /* other than speed op */ + mad_rpc_close_port(srcport); IBERROR("smp query nodeinfo: Node type not switch"); + } } if (argc-1 > 0) @@ -270,8 +281,10 @@ int main(int argc, char **argv) else printf("PortInfo:\n"); err = get_port_info(&portid, data, portnum, port_op); - if (err < 0) + if (err < 0) { + mad_rpc_close_port(srcport); IBERROR("smp query portinfo failed"); + } /* Only if one of the "set" options is chosen */ if (port_op) { @@ -287,14 +300,18 @@ int main(int argc, char **argv) } err = set_port_info(&portid, data, portnum, port_op); - if (err < 0) + if (err < 0) { + mad_rpc_close_port(srcport); IBERROR("smp set portinfo failed"); + } if (port_op == 3) { /* Reset port - so also enable */ mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 2); /* Polling */ err = set_port_info(&portid, data, portnum, port_op); - if (err < 0) + if (err < 0) { + mad_rpc_close_port(srcport); IBERROR("smp set portinfo failed"); + } } } else { /* query op */ /* only compare peer port if switch port */ @@ -320,23 +337,29 @@ int main(int argc, char **argv) /* Set DrSLID to local lid */ if (ib_resolve_self_via(&selfportid, - &selfport, 0, srcport) < 0) + &selfport, 0, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("could not resolve self"); + } peerportid.drpath.drslid = (uint16_t) selfportid.lid; peerportid.drpath.drdlid = 0xffff; /* Get peer port NodeInfo to obtain peer port number */ err = get_node_info(&peerportid, data); - if (err < 0) + if (err < 0) { + mad_rpc_close_port(srcport); IBERROR("smp query nodeinfo failed"); + } mad_decode_field(data, IB_NODE_LOCAL_PORT_F, &peerlocalportnum); printf("Peer PortInfo:\n"); /* Get peer port characteristics */ err = get_port_info(&peerportid, data, peerlocalportnum, port_op); - if (err < 0) + if (err < 0) { + mad_rpc_close_port(srcport); IBERROR("smp query peer portinfofailed"); + } mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F, &peerlwe ); mad_decode_field(data, IB_PORT_LINK_WIDTH_SUPPORTED_F, &peerlws); diff --git a/infiniband-diags/src/ibroute.c b/infiniband-diags/src/ibroute.c index 31b8e4c..feab823 100644 --- a/infiniband-diags/src/ibroute.c +++ b/infiniband-diags/src/ibroute.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -413,19 +414,25 @@ int main(int argc, char **argv) IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); if (!argc) { - if (ib_resolve_self_via(&portid, 0, 0, srcport) < 0) + if (ib_resolve_self_via(&portid, 0, 0, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve self addr"); + } } else if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", argv[1]); + } if (multicast) err = dump_multicast_tables(&portid, startlid, endlid); else err = dump_unicast_tables(&portid, startlid, endlid); - if (err) + if (err) { + mad_rpc_close_port(srcport); IBERROR("dump tables: %s", err); + } mad_rpc_close_port(srcport); exit(0); diff --git a/infiniband-diags/src/ibsendtrap.c b/infiniband-diags/src/ibsendtrap.c index f2b3e67..72aa3f4 100644 --- a/infiniband-diags/src/ibsendtrap.c +++ b/infiniband-diags/src/ibsendtrap.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2008 Lawrence Livermore National Security + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * Produced at Lawrence Livermore National Laboratory. * Written by Ira Weiny <[email protected]>. @@ -57,11 +58,15 @@ static int send_144_node_desc_update(void) ib_rpc_t trap_rpc; ib_mad_notice_attr_t notice; - if (ib_resolve_self_via(&selfportid, &selfport, NULL, srcport)) + if (ib_resolve_self_via(&selfportid, &selfport, NULL, srcport)) { + mad_rpc_close_port(srcport); IBERROR("can't resolve self"); + } - if (ib_resolve_smlid_via(&sm_port, 0, srcport)) + if (ib_resolve_smlid_via(&sm_port, 0, srcport)) { + mad_rpc_close_port(srcport); IBERROR("can't resolve SM destination port"); + } memset(&trap_rpc, 0, sizeof(trap_rpc)); trap_rpc.mgtclass = IB_SMI_CLASS; diff --git a/infiniband-diags/src/ibsysstat.c b/infiniband-diags/src/ibsysstat.c index 03c0515..738b1ab 100644 --- a/infiniband-diags/src/ibsysstat.c +++ b/infiniband-diags/src/ibsysstat.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -230,19 +231,25 @@ static char *ibsystat(ib_portid_t *portid, int attr) if (!portid->qkey) portid->qkey = IB_DEFAULT_QP1_QKEY; - if ((len = mad_build_pkt(buf, &rpc, portid, NULL, NULL)) < 0) + if ((len = mad_build_pkt(buf, &rpc, portid, NULL, NULL)) < 0) { + mad_rpc_close_port(srcport); IBPANIC("cannot build packet."); + } fd = mad_rpc_portid(srcport); agent = mad_rpc_class_agent(srcport, rpc.mgtclass); timeout = ibd_timeout ? ibd_timeout : MAD_DEF_TIMEOUT_MS; - if (umad_send(fd, agent, buf, len, timeout, 0) < 0) + if (umad_send(fd, agent, buf, len, timeout, 0) < 0) { + mad_rpc_close_port(srcport); IBPANIC("umad_send failed."); + } len = sizeof(buf) - umad_size(); - if (umad_recv(fd, buf, &len, timeout) < 0) + if (umad_recv(fd, buf, &len, timeout) < 0) { + mad_rpc_close_port(srcport); IBPANIC("umad_recv failed."); + } if (umad_status(buf)) return strerror(umad_status(buf)); @@ -342,25 +349,36 @@ int main(int argc, char **argv) IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); if (server) { - if (mad_register_server_via(sysstat_class, 1, 0, oui, srcport) < 0) + if (mad_register_server_via(sysstat_class, 1, 0, oui, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't serve class %d", sysstat_class); + } host_ncpu = build_cpuinfo(); - if ((err = ibsystat_serv())) + if ((err = ibsystat_serv())) { + mad_rpc_close_port(srcport); IBERROR("ibssystat to %s: %s", portid2str(&portid), err); + } + mad_rpc_close_port(srcport); exit(0); } - if (mad_register_client_via(sysstat_class, 1, srcport) < 0) + if (mad_register_client_via(sysstat_class, 1, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't register to sysstat class %d", sysstat_class); + } if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", argv[0]); + } - if ((err = ibsystat(&portid, attr))) + if ((err = ibsystat(&portid, attr))) { + mad_rpc_close_port(srcport); IBERROR("ibsystat to %s: %s", portid2str(&portid), err); + } mad_rpc_close_port(srcport); exit(0); diff --git a/infiniband-diags/src/ibtracert.c b/infiniband-diags/src/ibtracert.c index a887157..ba0c1e6 100644 --- a/infiniband-diags/src/ibtracert.c +++ b/infiniband-diags/src/ibtracert.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -490,11 +491,15 @@ find_mcpath(ib_portid_t *from, int mlid) DEBUG("from %s", portid2str(from)); - if (!(node = calloc(1, sizeof(Node)))) + if (!(node = calloc(1, sizeof(Node)))) { + mad_rpc_close_port(srcport); IBERROR("out of memory"); + } - if (!(port = calloc(1, sizeof(Port)))) + if (!(port = calloc(1, sizeof(Port)))) { + mad_rpc_close_port(srcport); IBERROR("out of memory"); + } if (get_node(node, port, from) < 0) { IBWARN("can't reach node %s", portid2str(from)); @@ -554,8 +559,10 @@ find_mcpath(ib_portid_t *from, int mlid) if (from->drpath.cnt > 0) path->drpath.cnt--; } else { - if (!(port = calloc(1, sizeof(Port)))) + if (!(port = calloc(1, sizeof(Port)))) { + mad_rpc_close_port(srcport); IBERROR("out of memory"); + } if (get_port(port, i, path) < 0) { IBWARN("can't reach node %s port %d", portid2str(path), i); @@ -575,11 +582,15 @@ find_mcpath(ib_portid_t *from, int mlid) return 0; } - if (!(remotenode = calloc(1, sizeof(Node)))) + if (!(remotenode = calloc(1, sizeof(Node)))) { + mad_rpc_close_port(srcport); IBERROR("out of memory"); + } - if (!(remoteport = calloc(1, sizeof(Port)))) + if (!(remoteport = calloc(1, sizeof(Port)))) { + mad_rpc_close_port(srcport); IBERROR("out of memory"); + } if (get_node(remotenode, remoteport, path) < 0) { IBWARN("NodeInfo on %s port %d failed, skipping port", @@ -757,20 +768,28 @@ int main(int argc, char **argv) node_name_map = open_node_name_map(node_name_map_file); if (ib_resolve_portid_str_via(&src_portid, argv[0], ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve source port %s", argv[0]); + } if (ib_resolve_portid_str_via(&dest_portid, argv[1], ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", argv[1]); + } if (ibd_dest_type == IB_DEST_DRPATH) { - if (resolve_lid(&src_portid, NULL) < 0) + if (resolve_lid(&src_portid, NULL) < 0) { + mad_rpc_close_port(srcport); IBERROR("cannot resolve lid for port \'%s\'", portid2str(&src_portid)); - if (resolve_lid(&dest_portid, NULL) < 0) + } + if (resolve_lid(&dest_portid, NULL) < 0) { + mad_rpc_close_port(srcport); IBERROR("cannot resolve lid for port \'%s\'", portid2str(&dest_portid)); + } } if (dest_portid.lid == 0 || src_portid.lid == 0) { @@ -780,26 +799,35 @@ int main(int argc, char **argv) if (ibd_dest_type != IB_DEST_DRPATH) { /* first find a direct path to the src port */ - if (find_route(&my_portid, &src_portid, 0) < 0) + if (find_route(&my_portid, &src_portid, 0) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't find a route to the src port"); + } src_portid = my_portid; } if (!multicast) { - if (find_route(&src_portid, &dest_portid, dumplevel) < 0) + if (find_route(&src_portid, &dest_portid, dumplevel) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't find a route from src to dest"); + } + mad_rpc_close_port(srcport); exit(0); } else { if (mlid < 0xc000) IBWARN("invalid MLID; must be 0xc000 or larger"); } - if (!(target_portguid = find_target_portguid(&dest_portid))) + if (!(target_portguid = find_target_portguid(&dest_portid))) { + mad_rpc_close_port(srcport); IBERROR("can't reach target lid %d", dest_portid.lid); + } - if (!(endnode = find_mcpath(&src_portid, mlid))) + if (!(endnode = find_mcpath(&src_portid, mlid))) { + mad_rpc_close_port(srcport); IBERROR("can't find a multicast route from src to dest"); + } /* dump multicast path */ dump_mcpath(endnode, dumplevel); diff --git a/infiniband-diags/src/perfquery.c b/infiniband-diags/src/perfquery.c index d35e995..98b7642 100644 --- a/infiniband-diags/src/perfquery.c +++ b/infiniband-diags/src/perfquery.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. * Copyright (c) 2007 Xsigo Systems Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -262,7 +263,7 @@ static void output_aggregate_perfcounters_ext(ib_portid_t *portid) mad_dump_perfcounters_ext(buf, sizeof buf, pc, sizeof pc); - printf("# Port counters: %s port %d\n%s", portid2str(portid), ALL_PORTS, buf); + printf("# Port extended counters: %s port %d\n%s", portid2str(portid), ALL_PORTS, buf); } static void dump_perfcounters(int extended, int timeout, uint16_t cap_mask, @@ -272,10 +273,13 @@ static void dump_perfcounters(int extended, int timeout, uint16_t cap_mask, if (extended != 1) { if (!pma_query_via(pc, portid, port, timeout, - IB_GSI_PORT_COUNTERS, srcport)) + IB_GSI_PORT_COUNTERS, srcport)) { + mad_rpc_close_port(srcport); IBERROR("perfquery"); + } if (!(cap_mask & 0x1000)) { /* if PortCounters:PortXmitWait not suppported clear this counter */ + IBWARN("PortXmitWait not indicated so ignore this counter"); perf_count.xmtwait = 0; mad_encode_field(pc, IB_PC_XMT_WAIT_F, &perf_count.xmtwait); } @@ -285,31 +289,44 @@ static void dump_perfcounters(int extended, int timeout, uint16_t cap_mask, mad_dump_perfcounters(buf, sizeof buf, pc, sizeof pc); } else { if (!(cap_mask & 0x200)) /* 1.2 errata: bit 9 is extended counter support */ - IBWARN("PerfMgt ClassPortInfo 0x%x extended counters not indicated\n", cap_mask); + IBWARN("PerfMgt ClassPortInfo 0x%x extended counters not indicated", cap_mask); if (!pma_query_via(pc, portid, port, timeout, - IB_GSI_PORT_COUNTERS_EXT, srcport)) + IB_GSI_PORT_COUNTERS_EXT, srcport)) { + mad_rpc_close_port(srcport); IBERROR("perfextquery"); + } if (aggregate) aggregate_perfcounters_ext(); else mad_dump_perfcounters_ext(buf, sizeof buf, pc, sizeof pc); } - if (!aggregate) - printf("# Port counters: %s port %d\n%s", portid2str(portid), port, buf); + if (!aggregate) { + if (extended) + printf("# Port extended counters: %s port %d\n%s", + portid2str(portid), port, buf); + else + printf("# Port counters: %s port %d\n%s", + portid2str(portid), port, buf); + } } -static void reset_counters(int extended, int timeout, int mask, ib_portid_t *portid, int port) +static void reset_counters(int extended, int timeout, int mask, + ib_portid_t *portid, int port) { if (extended != 1) { if (!performance_reset_via(pc, portid, port, mask, timeout, - IB_GSI_PORT_COUNTERS, srcport)) + IB_GSI_PORT_COUNTERS, srcport)) { + mad_rpc_close_port(srcport); IBERROR("perf reset"); + } } else { if (!performance_reset_via(pc, portid, port, mask, timeout, - IB_GSI_PORT_COUNTERS_EXT, srcport)) + IB_GSI_PORT_COUNTERS_EXT, srcport)) { + mad_rpc_close_port(srcport); IBERROR("perf ext reset"); + } } } @@ -321,22 +338,28 @@ void xmt_sl_query(ib_portid_t *portid, int port, int mask) if (reset_only) { if (!performance_reset_via(pc, portid, port, mask, ibd_timeout, - IB_GSI_PORT_XMIT_DATA_SL, srcport)) + IB_GSI_PORT_XMIT_DATA_SL, srcport)) { + mad_rpc_close_port(srcport); IBERROR("perfslreset"); + } return; } if (!pma_query_via(pc, portid, port, ibd_timeout, - IB_GSI_PORT_XMIT_DATA_SL, srcport)) + IB_GSI_PORT_XMIT_DATA_SL, srcport)) { + mad_rpc_close_port(srcport); IBERROR("perfslquery"); + } mad_dump_perfcounters_xmt_sl(buf, sizeof buf, pc, sizeof pc); printf("# Port counters: %s port %d\n%s", portid2str(portid), port, buf); if(reset) if (!performance_reset_via(pc, portid, port, mask, ibd_timeout, - IB_GSI_PORT_XMIT_DATA_SL, srcport)) + IB_GSI_PORT_XMIT_DATA_SL, srcport)) { + mad_rpc_close_port(srcport); IBERROR("perfslreset"); + } } void rcv_sl_query(ib_portid_t *portid, int port, int mask) @@ -345,22 +368,28 @@ void rcv_sl_query(ib_portid_t *portid, int port, int mask) if (reset_only) { if (!performance_reset_via(pc, portid, port, mask, ibd_timeout, - IB_GSI_PORT_RCV_DATA_SL, srcport)) + IB_GSI_PORT_RCV_DATA_SL, srcport)) { + mad_rpc_close_port(srcport); IBERROR("perfslreset"); + } return; } if (!pma_query_via(pc, portid, port, ibd_timeout, - IB_GSI_PORT_RCV_DATA_SL, srcport)) + IB_GSI_PORT_RCV_DATA_SL, srcport)) { + mad_rpc_close_port(srcport); IBERROR("perfslquery"); + } mad_dump_perfcounters_rcv_sl(buf, sizeof buf, pc, sizeof pc); printf("# Port counters: %s port %d\n%s", portid2str(portid), port, buf); if(reset) if (!performance_reset_via(pc, portid, port, mask, ibd_timeout, - IB_GSI_PORT_RCV_DATA_SL, srcport)) + IB_GSI_PORT_RCV_DATA_SL, srcport)) { + mad_rpc_close_port(srcport); IBERROR("perfslreset"); + } } static int process_opt(void *context, int ch, char *optarg) @@ -396,7 +425,8 @@ static int process_opt(void *context, int ch, char *optarg) int main(int argc, char **argv) { - int mgmt_classes[4] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS, IB_PERFORMANCE_CLASS}; + int mgmt_classes[4] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS, + IB_PERFORMANCE_CLASS}; ib_portid_t portid = {0}; int mask = 0xffff; uint16_t cap_mask; @@ -450,23 +480,31 @@ int main(int argc, char **argv) if (argc) { if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", argv[0]); + } } else { - if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0) + if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve self port %s", argv[0]); + } } /* PerfMgt ClassPortInfo is a required attribute */ if (!pma_query_via(pc, &portid, port, ibd_timeout, CLASS_PORT_INFO, - srcport)) + srcport)) { + mad_rpc_close_port(srcport); IBERROR("classportinfo query"); + } /* ClassPortInfo should be supported as part of libibmad */ memcpy(&cap_mask, pc + 2, sizeof(cap_mask)); /* CapabilityMask */ cap_mask = ntohs(cap_mask); if (!(cap_mask & 0x100)) { /* bit 8 is AllPortSelect */ - if (!all_ports && port == ALL_PORTS) + if (!all_ports && port == ALL_PORTS) { + mad_rpc_close_port(srcport); IBERROR("AllPortSelect not supported"); + } if (all_ports) all_ports_loop = 1; } @@ -483,17 +521,23 @@ int main(int argc, char **argv) if (all_ports_loop || (loop_ports && (all_ports || port == ALL_PORTS))) { if (smp_query_via(data, &portid, IB_ATTR_NODE_INFO, 0, 0, - srcport) < 0) + srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("smp query nodeinfo failed"); + } node_type = mad_get_field(data, 0, IB_NODE_TYPE_F); mad_decode_field(data, IB_NODE_NPORTS_F, &num_ports); - if (!num_ports) + if (!num_ports) { + mad_rpc_close_port(srcport); IBERROR("smp query nodeinfo: num ports invalid"); + } if (node_type == IB_NODE_SWITCH) { if (smp_query_via(data, &portid, IB_ATTR_SWITCH_INFO, - 0, 0, srcport) < 0) + 0, 0, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("smp query nodeinfo failed"); + } enhancedport0 = mad_get_field(data, 0, IB_SW_ENHANCED_PORT0_F); if (enhancedport0) start_port = 0; @@ -523,15 +567,13 @@ int main(int argc, char **argv) goto done; do_reset: - if (argc <= 2 && !extended && (cap_mask & 0x1000)) mask |= (1<<16); /* reset portxmitwait */ if (all_ports_loop || (loop_ports && (all_ports || port == ALL_PORTS))) { for (i = start_port; i <= num_ports; i++) reset_counters(extended, ibd_timeout, mask, &portid, i); - } - else + } else reset_counters(extended, ibd_timeout, mask, &portid, port); done: diff --git a/infiniband-diags/src/saquery.c b/infiniband-diags/src/saquery.c index dddebc1..e5f1287 100644 --- a/infiniband-diags/src/saquery.c +++ b/infiniband-diags/src/saquery.c @@ -3,6 +3,7 @@ * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved. * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * Produced at Lawrence Livermore National Laboratory. * Written by Ira Weiny <[email protected]>. @@ -99,6 +100,7 @@ struct query_cmd { static char *node_name_map_file = NULL; static nn_map_t *node_name_map = NULL; static uint64_t smkey = 1; +static struct ibmad_port *srcport; /** * Declare some globals because I don't want this to be too complex. @@ -141,8 +143,10 @@ static int sa_query(struct bind_handle *h, uint8_t method, rpc.dataoffs = IB_SA_DATA_OFFS; umad = calloc(1, len + umad_size()); - if (!umad) + if (!umad) { + mad_rpc_close_port(srcport); IBPANIC("cannot alloc mem for umad: %s\n", strerror(errno)); + } mad_build_pkt(umad, &rpc, &h->dport, NULL, data); @@ -152,9 +156,11 @@ static int sa_query(struct bind_handle *h, uint8_t method, xdump(stdout, "SA Request:\n", umad_get_mad(umad), len); ret = umad_send(h->fd, h->agent, umad, len, ibd_timeout, 0); - if (ret < 0) + if (ret < 0) { + mad_rpc_close_port(srcport); IBPANIC("umad_send failed: attr %u: %s\n", attr, strerror(errno)); + } recv_mad: ret = umad_recv(h->fd, umad, &len, ibd_timeout); @@ -163,6 +169,7 @@ recv_mad: umad = realloc(umad, umad_size() + len); goto recv_mad; } + mad_rpc_close_port(srcport); IBPANIC("umad_recv failed: attr %u: %s\n", attr, strerror(errno)); } @@ -1324,7 +1331,6 @@ static int query_mft_records(const struct query_cmd *q, bind_handle_t h, static bind_handle_t get_bind_handle(void) { - static struct ibmad_port *srcport; static struct bind_handle handle; int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS }; @@ -1333,8 +1339,10 @@ static bind_handle_t get_bind_handle(void) IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); ib_resolve_smlid_via(&handle.dport, ibd_timeout, srcport); - if (!handle.dport.lid) + if (!handle.dport.lid) { + mad_rpc_close_port(srcport); IBPANIC("No SM found."); + } handle.dport.qp = 1; if (!handle.dport.qkey) diff --git a/infiniband-diags/src/sminfo.c b/infiniband-diags/src/sminfo.c index ebf6a47..f987445 100644 --- a/infiniband-diags/src/sminfo.c +++ b/infiniband-diags/src/sminfo.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -121,11 +122,15 @@ int main(int argc, char **argv) if (argc) { if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type, - 0, srcport) < 0) + 0, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", argv[0]); + } } else { - if (ib_resolve_smlid_via(&portid, ibd_timeout, srcport) < 0) + if (ib_resolve_smlid_via(&portid, ibd_timeout, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve sm port %s", argv[0]); + } } mad_encode_field(sminfo, IB_SMINFO_GUID_F, &guid); @@ -136,12 +141,15 @@ int main(int argc, char **argv) if (mod) { if (!(p = smp_set_via(sminfo, &portid, IB_ATTR_SMINFO, mod, - ibd_timeout, srcport))) - IBERROR("query"); - } else - if (!(p = smp_query_via(sminfo, &portid, IB_ATTR_SMINFO, 0, - ibd_timeout, srcport))) + ibd_timeout, srcport))) { + mad_rpc_close_port(srcport); IBERROR("query"); + } + } else if (!(p = smp_query_via(sminfo, &portid, IB_ATTR_SMINFO, 0, + ibd_timeout, srcport))) { + mad_rpc_close_port(srcport); + IBERROR("query"); + } mad_decode_field(sminfo, IB_SMINFO_GUID_F, &guid); mad_decode_field(sminfo, IB_SMINFO_ACT_F, &act); diff --git a/infiniband-diags/src/smpquery.c b/infiniband-diags/src/smpquery.c index 2ed1e65..dc6f0fa 100644 --- a/infiniband-diags/src/smpquery.c +++ b/infiniband-diags/src/smpquery.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -460,20 +461,28 @@ int main(int argc, char **argv) if (ibd_dest_type != IB_DEST_DRSLID) { if (ib_resolve_portid_str_via(&portid, argv[1], ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", argv[1]); - if ((err = fn(&portid, argv+2, argc-2))) + } + if ((err = fn(&portid, argv+2, argc-2))) { + mad_rpc_close_port(srcport); IBERROR("operation %s: %s", argv[0], err); + } } else { char concat[64]; memset(concat, 0, 64); snprintf(concat, sizeof(concat), "%s %s", argv[1], argv[2]); if (ib_resolve_portid_str_via(&portid, concat, ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", concat); - if ((err = fn(&portid, argv+3, argc-3))) + } + if ((err = fn(&portid, argv+3, argc-3))) { + mad_rpc_close_port(srcport); IBERROR("operation %s: %s", argv[0], err); + } } close_node_name_map(node_name_map); mad_rpc_close_port(srcport); diff --git a/infiniband-diags/src/vendstat.c b/infiniband-diags/src/vendstat.c index 0f09039..b4e3825 100644 --- a/infiniband-diags/src/vendstat.c +++ b/infiniband-diags/src/vendstat.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. + * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -160,17 +161,23 @@ int main(int argc, char **argv) if (argc) { if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type, - ibd_sm_id, srcport) < 0) + ibd_sm_id, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve destination port %s", argv[0]); + } } else { - if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0) + if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0) { + mad_rpc_close_port(srcport); IBERROR("can't resolve self port %s", argv[0]); + } } /* Only General Info and Port Xmit Wait Counters */ /* queries are currently supported */ - if (!general_info && !xmit_wait) + if (!general_info && !xmit_wait) { + mad_rpc_close_port(srcport); IBERROR("at least one of -N and -w must be specified"); + } /* These are Mellanox specific vendor MADs */ /* but vendors change the VendorId so how know for sure ? */ @@ -185,13 +192,18 @@ int main(int argc, char **argv) memset(&buf, 0, sizeof(buf)); /* vendor ClassPortInfo is required attribute if class supported */ call.attrid = CLASS_PORT_INFO; - if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) + if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) { + mad_rpc_close_port(srcport); IBERROR("classportinfo query"); + } memset(&buf, 0, sizeof(buf)); call.attrid = IB_MLX_IS3_GENERAL_INFO; - if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) + if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) { + mad_rpc_close_port(srcport); IBERROR("vendstat"); + } + gi = (is3_general_info_t *)&buf; if (general_info) { @@ -211,8 +223,10 @@ int main(int argc, char **argv) } if (xmit_wait) { - if (ntohs(gi->hw_info.device_id) != IS3_DEVICE_ID) + if (ntohs(gi->hw_info.device_id) != IS3_DEVICE_ID) { + mad_rpc_close_port(srcport); IBERROR("Unsupported device ID 0x%x", ntohs(gi->hw_info.device_id)); + } memset(&buf, 0, sizeof(buf)); call.attrid = IB_MLX_IS3_CONFIG_SPACE_ACCESS; @@ -222,8 +236,10 @@ int main(int argc, char **argv) cs = (is3_config_space_t *)&buf; for (i = 0; i < 16; i++) cs->record[i].address = htonl(IB_MLX_IS3_PORT_XMIT_WAIT + ((i + 1) << 12)); - if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) + if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) { + mad_rpc_close_port(srcport); IBERROR("vendstat"); + } for (i = 0; i < 16; i++) if (cs->record[i].data) /* PortXmitWait is 32 bit counter */ @@ -237,8 +253,10 @@ int main(int argc, char **argv) cs = (is3_config_space_t *)&buf; for (i = 0; i < 8; i++) cs->record[i].address = htonl(IB_MLX_IS3_PORT_XMIT_WAIT + ((i + 17) << 12)); - if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) + if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) { + mad_rpc_close_port(srcport); IBERROR("vendstat"); + } for (i = 0; i < 8; i++) if (cs->record[i].data) /* PortXmitWait is 32 bit counter */ _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
