[ofa-general] [PATCH 4/5] infiniband-diags/libibnetdisc: Introduce a context object.
Ira Weiny
weiny2 at llnl.gov
Thu Aug 13 20:43:06 PDT 2009
From: Ira Weiny <weiny2 at llnl.gov>
Date: Thu, 13 Aug 2009 20:16:01 -0700
Subject: [PATCH] infiniband-diags/libibnetdisc: Introduce a context object.
This object must be created before query functions can be used and is
used to control the functionality of the queries.
Signed-off-by: Ira Weiny <weiny2 at llnl.gov>
---
infiniband-diags/libibnetdisc/Makefile.am | 4 +-
.../libibnetdisc/include/infiniband/ibnetdisc.h | 23 ++++--
.../libibnetdisc/man/ibnd_create_ctx.3 | 2 +
.../libibnetdisc/man/ibnd_destroy_ctx.3 | 2 +
.../libibnetdisc/man/ibnd_discover_fabric.3 | 41 ++++++++---
infiniband-diags/libibnetdisc/src/ibnetdisc.c | 74 ++++++++++++++------
infiniband-diags/libibnetdisc/src/internal.h | 5 ++
infiniband-diags/libibnetdisc/src/libibnetdisc.map | 2 +
infiniband-diags/libibnetdisc/test/testleaks.c | 7 ++-
infiniband-diags/src/iblinkinfo.c | 8 ++-
infiniband-diags/src/ibnetdiscover.c | 13 +++-
infiniband-diags/src/ibqueryerrors.c | 8 ++-
12 files changed, 141 insertions(+), 48 deletions(-)
create mode 100644 infiniband-diags/libibnetdisc/man/ibnd_create_ctx.3
create mode 100644 infiniband-diags/libibnetdisc/man/ibnd_destroy_ctx.3
diff --git a/infiniband-diags/libibnetdisc/Makefile.am b/infiniband-diags/libibnetdisc/Makefile.am
index 7085f14..5619aad 100644
--- a/infiniband-diags/libibnetdisc/Makefile.am
+++ b/infiniband-diags/libibnetdisc/Makefile.am
@@ -45,7 +45,9 @@ man_MANS = man/ibnd_debug.3 \
man/ibnd_iter_nodes.3 \
man/ibnd_iter_nodes_type.3 \
man/ibnd_show_progress.3 \
- man/ibnd_update_node.3
+ man/ibnd_update_node.3 \
+ man/ibnd_create_ctx.3 \
+ man/ibnd_destroy_ctx.3
EXTRA_DIST = $(srcdir)/src/libibnetdisc.map libibnetdisc.ver $(man_MANS)
diff --git a/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h b/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
index 414e068..65ba74f 100644
--- a/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
+++ b/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
@@ -38,8 +38,11 @@
#include <infiniband/mad.h>
#include <iba/ib_types.h>
-struct ibnd_chassis; /* forward declare */
-struct ibnd_port; /* forward declare */
+typedef struct ibnd_ctx ibnd_ctx_t;
+
+/* forward declares */
+struct ibnd_chassis;
+struct ibnd_port;
/** =========================================================================
* Node
@@ -159,15 +162,21 @@ typedef struct ibnd_fabric {
} ibnd_fabric_t;
/** =========================================================================
- * Initialization (fabric operations)
+ * Initialization
*/
MAD_EXPORT void ibnd_debug(int i);
-MAD_EXPORT void ibnd_show_progress(int i);
-MAD_EXPORT ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port *ibmad_port,
+MAD_EXPORT ibnd_ctx_t *ibnd_create_ctx(struct ibmad_port *ibmad_port);
+MAD_EXPORT void ibnd_destroy_ctx(ibnd_ctx_t * ctx);
+MAD_EXPORT int ibnd_show_progress(ibnd_ctx_t * ctx, int i);
+
+/** =========================================================================
+ * Fabric Operations
+ */
+MAD_EXPORT ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t * ctx,
ib_portid_t * from, int hops);
/**
- * open: (required) ibmad_port object from libibmad
+ * ctx : (required) context created by ibnd_create_ctx.
* from: (optional) specify the node to start scanning from.
* If NULL start from the node we are running on.
* hops: (optional) Specify how much of the fabric to traverse.
@@ -181,7 +190,7 @@ MAD_EXPORT void ibnd_destroy_fabric(ibnd_fabric_t * fabric);
MAD_EXPORT ibnd_node_t *ibnd_find_node_guid(ibnd_fabric_t * fabric,
uint64_t guid);
MAD_EXPORT ibnd_node_t *ibnd_find_node_dr(ibnd_fabric_t * fabric, char *dr_str);
-MAD_EXPORT ibnd_node_t *ibnd_update_node(struct ibmad_port *ibmad_port,
+MAD_EXPORT ibnd_node_t *ibnd_update_node(ibnd_ctx_t * ctx,
ibnd_fabric_t * fabric,
ibnd_node_t * node);
diff --git a/infiniband-diags/libibnetdisc/man/ibnd_create_ctx.3 b/infiniband-diags/libibnetdisc/man/ibnd_create_ctx.3
new file mode 100644
index 0000000..8b321b0
--- /dev/null
+++ b/infiniband-diags/libibnetdisc/man/ibnd_create_ctx.3
@@ -0,0 +1,2 @@
+.\".TH IBND_CREATE_CTX 3 "Aug 12, 2009" "OpenIB" "OpenIB Programmer's Manual"
+.so man3/ibnd_discover_fabric.3
diff --git a/infiniband-diags/libibnetdisc/man/ibnd_destroy_ctx.3 b/infiniband-diags/libibnetdisc/man/ibnd_destroy_ctx.3
new file mode 100644
index 0000000..bb9d96a
--- /dev/null
+++ b/infiniband-diags/libibnetdisc/man/ibnd_destroy_ctx.3
@@ -0,0 +1,2 @@
+.\".TH IBND_DESTROY_CTX 3 "Aug 12, 2009" "OpenIB" "OpenIB Programmer's Manual"
+.so man3/ibnd_discover_fabric.3
diff --git a/infiniband-diags/libibnetdisc/man/ibnd_discover_fabric.3 b/infiniband-diags/libibnetdisc/man/ibnd_discover_fabric.3
index dfeaf47..f014977 100644
--- a/infiniband-diags/libibnetdisc/man/ibnd_discover_fabric.3
+++ b/infiniband-diags/libibnetdisc/man/ibnd_discover_fabric.3
@@ -1,46 +1,65 @@
.TH IBND_DISCOVER_FABRIC 3 "July 25, 2008" "OpenIB" "OpenIB Programmer's Manual"
.SH "NAME"
-ibnd_discover_fabric, ibnd_destroy_fabric, ibnd_debug ibnd_show_progress \- initialize ibnetdiscover library.
+ibnd_create_ctx, ibnd_destroy_ctx,
+ibnd_discover_fabric, ibnd_destroy_fabric, ibnd_debug, ibnd_show_progress \-
+initialize ibnetdiscover library and query the fabric.
.SH "SYNOPSIS"
.nf
.B #include <infiniband/ibnetdisc.h>
.sp
-.bi "ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port *ibmad_port, int timeout_ms, ib_portid_t *from, int hops)"
+.bi "ibnd_ctx_t *ibnd_create_ctx(struct ibmad_port *ibmad_port)"
+.BI "void ibnd_destroy_ctx(ibnd_ctx_t *ctx)"
+.bi "ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t *ctx, ib_portid_t *from, int hops)"
.BI "void ibnd_destroy_fabric(ibnd_fabric_t *fabric)"
.BI "void ibnd_debug(int i)"
-.BI "void ibnd_show_progress(int i)"
+.BI "int ibnd_show_progress(ibnd_ctx_t *ctx, int i)"
.SH "DESCRIPTION"
-.B ibnd_discover_fabric()
-Discover the fabric connected to the port specified by ibmad_port, using a timeout specified. The "from" and "hops" parameters are optional and allow one to scan part of a fabric by specifying a node "from" and a number of hops away from that node to scan, "hops". This gives the user a "sub-fabric" which is "centered" anywhere they chose.
+.B ibnd_create_ctx()
+Create a context for the ibnetdiscover library to be used in query operations.
ibmad_port must be opened with at least IB_SMI_CLASS and IB_SMI_DIRECT_CLASS
-classes for ibnd_discover_fabric to work.
+classes for queries to work.
+
+.B ibnd_discover_fabric()
+Discover the fabric using the context specified. The "from" and "hops" parameters are optional and allow one to scan part of a fabric by specifying a node "from" and a number of hops away from that node to scan, "hops". This gives the user a "sub-fabric" which is "centered" anywhere they chose.
.B ibnd_destroy_fabric()
free all memory and resources associated with the fabric.
+.B ibnd_destroy_ctx()
+free all memory and resources associated with the context.
+
.B ibnd_debug()
Set the debug level to be printed as library operations take place.
-.B ibnd_debug()
-Indicate that the library should print debug output which shows it's progress
+.B ibnd_show_progress()
+Indicate that the library should print output which shows it's progress
through the fabric.
.SH "RETURN VALUE"
+.B ibnd_create_ctx()
+return NULL on failure, otherwise a valid ibnd_ctx_t object.
+
.B ibnd_discover_fabric()
return NULL on failure, otherwise a valid ibnd_fabric_t object.
-.B ibnd_destory_fabric(), ibnd_debug()
+.B ibnd_show_progress()
+Returnes the previous setting for this value.
+
+.B ibnd_destory_fabric(), ibnd_debug(), ibnd_destroy_ctx()
NONE
+
.SH "EXAMPLES"
.B Discover the entire fabric connected to device "mthca0", port 1.
int mgmt_classes[2] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS};
struct ibmad_port *ibmad_port = mad_rpc_open_port(ca, ca_port, mgmt_classes, 2);
- ibnd_fabric_t *fabric = ibnd_discover_fabric(ibmad_port, 100, NULL, 0);
+ ibnd_ctx_t *ctx = ibnd_create_ctx(ibmad_port);
+ ibnd_fabric_t *fabric = ibnd_discover_fabric(ctx, NULL, 0);
...
ibnd_destroy_fabric(fabric);
+ ibnd_destroy_ctx(ctx);
mad_rpc_close_port(ibmad_port);
.B Discover only a single node and those nodes connected to it.
@@ -48,7 +67,7 @@ NONE
...
str2drpath(&(port_id.drpath), from, 0, 0);
...
- ibnd_discover_fabric(ibmad_port, 100, &port_id, 1);
+ ibnd_discover_fabric(ctx, &port_id, 1);
...
.SH "SEE ALSO"
libibmad, mad_rpc_open_port
diff --git a/infiniband-diags/libibnetdisc/src/ibnetdisc.c b/infiniband-diags/libibnetdisc/src/ibnetdisc.c
index 2cd2c9b..4b320cd 100644
--- a/infiniband-diags/libibnetdisc/src/ibnetdisc.c
+++ b/infiniband-diags/libibnetdisc/src/ibnetdisc.c
@@ -57,9 +57,23 @@
#include "internal.h"
#include "chassis.h"
-static int show_progress = 0;
int ibdebug;
+ibnd_ctx_t *ibnd_create_ctx(struct ibmad_port *ibmad_port)
+{
+ ibnd_ctx_t *rc = calloc(1, sizeof *rc);
+ if (!rc)
+ return (NULL);
+
+ rc->ibmad_port = ibmad_port;
+ return (rc);
+}
+
+void ibnd_destroy_ctx(ibnd_ctx_t * ctx)
+{
+ free(ctx);
+}
+
void decode_port_info(ibnd_port_t * port)
{
port->base_lid = (uint16_t) mad_get_field(port->info, 0, IB_PORT_LID_F);
@@ -204,8 +218,6 @@ static void dump_endnode(ib_portid_t * path, char *prompt,
ibnd_node_t * node, ibnd_port_t * port)
{
char type[64];
- if (!show_progress)
- return;
mad_dump_node_type(type, 64, &(node->type), sizeof(int)),
printf("%s -> %s %s {%016" PRIx64
@@ -261,16 +273,29 @@ static int _check_ibmad_port(struct ibmad_port *ibmad_port)
return (0);
}
-ibnd_node_t *ibnd_update_node(struct ibmad_port * ibmad_port,
- ibnd_fabric_t * fabric, ibnd_node_t * node)
+static int check_ctx(ibnd_ctx_t * ctx)
+{
+ if (!ctx) {
+ IBND_DEBUG("ctx must be specified\n");
+ return (-1);
+ }
+
+ return (_check_ibmad_port(ctx->ibmad_port));
+}
+
+ibnd_node_t *ibnd_update_node(ibnd_ctx_t * ctx, ibnd_fabric_t * fabric,
+ ibnd_node_t * node)
{
char portinfo_port0[IB_SMP_DATA_SIZE];
void *nd = node->nodedesc;
int p = 0;
+ struct ibmad_port *ibmad_port;
- if (_check_ibmad_port(ibmad_port) < 0)
+ if (check_ctx(ctx) < 0)
return (NULL);
+ ibmad_port = ctx->ibmad_port;
+
if (!fabric) {
IBND_DEBUG("fabric parameter NULL\n");
return (NULL);
@@ -476,12 +501,12 @@ static void link_ports(ibnd_node_t * node, ibnd_port_t * port,
remoteport->remoteport = (ibnd_port_t *) port;
}
-static int get_remote_node(struct ibmad_port *ibmad_port,
- ibnd_fabric_t * fabric, ibnd_node_t * node,
- ibnd_port_t * port, ib_portid_t * path,
- int portnum, int dist)
+static int get_remote_node(ibnd_ctx_t * ctx, ibnd_fabric_t * fabric,
+ ibnd_node_t * node, ibnd_port_t * port,
+ ib_portid_t * path, int portnum, int dist)
{
int rc = 0;
+ struct ibmad_port *ibmad_port = ctx->ibmad_port;
ibnd_node_t node_buf;
ibnd_port_t port_buf;
ibnd_node_t *remotenode, *oldnode;
@@ -525,8 +550,9 @@ static int get_remote_node(struct ibmad_port *ibmad_port,
goto error;
}
- dump_endnode(path, oldnode ? "known remote" : "new remote",
- remotenode, remoteport);
+ if (ctx->show_progress)
+ dump_endnode(path, oldnode ? "known remote" : "new remote",
+ remotenode, remoteport);
link_ports(node, port, remotenode, remoteport);
@@ -535,7 +561,7 @@ error:
return (rc);
}
-ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
+ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t * ctx,
ib_portid_t * from, int hops)
{
int rc = 0;
@@ -550,7 +576,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
ib_portid_t *path;
int max_hops = MAXHOPS - 1; /* default find everything */
- if (_check_ibmad_port(ibmad_port) < 0)
+ if (check_ctx(ctx) < 0)
return (NULL);
/* if not everything how much? */
@@ -576,7 +602,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
memset(&node_buf, 0, sizeof(node_buf));
memset(&port_buf, 0, sizeof(port_buf));
- if (query_node(ibmad_port, fabric, &node_buf, &port_buf, from)) {
+ if (query_node(ctx->ibmad_port, fabric, &node_buf, &port_buf, from)) {
IBND_DEBUG("can't reach node %s\n", portid2str(from));
goto error;
}
@@ -591,7 +617,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
if (!port)
goto error;
- rc = get_remote_node(ibmad_port, fabric, node, port, from,
+ rc = get_remote_node(ctx, fabric, node, port, from,
mad_get_field(node->info, 0,
IB_NODE_LOCAL_PORT_F), 0);
if (rc < 0)
@@ -606,14 +632,15 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
path = &node->path_portid;
IBND_DEBUG("dist %d node %p\n", dist, node);
- dump_endnode(path, "processing", node, port);
+ if (ctx->show_progress)
+ dump_endnode(path, "processing", node, port);
for (i = 1; i <= node->numports; i++) {
if (i == mad_get_field(node->info, 0,
IB_NODE_LOCAL_PORT_F))
continue;
- if (get_port_info(ibmad_port, fabric,
+ if (get_port_info(ctx->ibmad_port, fabric,
&port_buf, i, path)) {
IBND_ERROR
("can't reach node %s port %d",
@@ -637,7 +664,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
IB_NODE_PORT_GUID_F);
}
- if (get_remote_node(ibmad_port, fabric, node,
+ if (get_remote_node(ctx, fabric, node,
port, path, i, dist) < 0)
goto error;
}
@@ -704,9 +731,14 @@ void ibnd_debug(int i)
}
}
-void ibnd_show_progress(int i)
+int ibnd_show_progress(ibnd_ctx_t * ctx, int i)
{
- show_progress = i;
+ int rc = 0;
+ if (check_ctx(ctx))
+ return (-1);
+ rc = ctx->show_progress;
+ ctx->show_progress = i;
+ return (rc);
}
void ibnd_iter_nodes(ibnd_fabric_t * fabric, ibnd_iter_node_func_t func,
diff --git a/infiniband-diags/libibnetdisc/src/internal.h b/infiniband-diags/libibnetdisc/src/internal.h
index ba32291..8753eae 100644
--- a/infiniband-diags/libibnetdisc/src/internal.h
+++ b/infiniband-diags/libibnetdisc/src/internal.h
@@ -47,4 +47,9 @@
#define IBND_ERROR(fmt, ...) \
fprintf(stderr, "%s:%u; " fmt, __FILE__, __LINE__, ## __VA_ARGS__)
+struct ibnd_ctx {
+ struct ibmad_port *ibmad_port;
+ int show_progress;
+};
+
#endif /* _INTERNAL_H_ */
diff --git a/infiniband-diags/libibnetdisc/src/libibnetdisc.map b/infiniband-diags/libibnetdisc/src/libibnetdisc.map
index bd108ab..56560ec 100644
--- a/infiniband-diags/libibnetdisc/src/libibnetdisc.map
+++ b/infiniband-diags/libibnetdisc/src/libibnetdisc.map
@@ -2,6 +2,8 @@ IBNETDISC_1.0 {
global:
ibnd_debug;
ibnd_show_progress;
+ ibnd_create_ctx;
+ ibnd_destroy_ctx;
ibnd_discover_fabric;
ibnd_destroy_fabric;
ibnd_find_node_guid;
diff --git a/infiniband-diags/libibnetdisc/test/testleaks.c b/infiniband-diags/libibnetdisc/test/testleaks.c
index cb5651e..b121bdd 100644
--- a/infiniband-diags/libibnetdisc/test/testleaks.c
+++ b/infiniband-diags/libibnetdisc/test/testleaks.c
@@ -87,6 +87,7 @@ int main(int argc, char **argv)
int hops = 0;
ib_portid_t port_id;
int iters = -1;
+ ibnd_ctx_t *ctx = NULL;
struct ibmad_port *ibmad_port;
int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
@@ -156,11 +157,12 @@ int main(int argc, char **argv)
mad_rpc_set_timeout(ibmad_port, timeout_ms);
+ ctx = ibnd_create_ctx(ibmad_port);
while (iters == -1 || iters-- > 0) {
if (from) {
/* only scan part of the fabric */
str2drpath(&(port_id.drpath), from, 0, 0);
- if ((fabric = ibnd_discover_fabric(ibmad_port,
+ if ((fabric = ibnd_discover_fabric(ctx,
&port_id,
hops)) == NULL) {
fprintf(stderr, "discover failed\n");
@@ -170,7 +172,7 @@ int main(int argc, char **argv)
guid = 0;
} else {
if ((fabric =
- ibnd_discover_fabric(ibmad_port, NULL,
+ ibnd_discover_fabric(ctx, NULL,
-1)) == NULL) {
fprintf(stderr, "discover failed\n");
rc = 1;
@@ -182,6 +184,7 @@ int main(int argc, char **argv)
}
close_port:
+ ibnd_destroy_ctx(ctx);
mad_rpc_close_port(ibmad_port);
exit(rc);
}
diff --git a/infiniband-diags/src/iblinkinfo.c b/infiniband-diags/src/iblinkinfo.c
index 5dfadee..af5be09 100644
--- a/infiniband-diags/src/iblinkinfo.c
+++ b/infiniband-diags/src/iblinkinfo.c
@@ -274,6 +274,7 @@ main(int argc, char **argv)
int rc = 0;
int resolved = -1;
ibnd_fabric_t *fabric = NULL;
+ ibnd_ctx_t *ctx = NULL;
struct ibmad_port *ibmad_port;
ib_portid_t port_id = {0};
int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
@@ -313,6 +314,8 @@ main(int argc, char **argv)
node_name_map = open_node_name_map(node_name_map_file);
+ ctx = ibnd_create_ctx(ibmad_port);
+
if (dr_path) {
/* only scan part of the fabric */
if ((resolved = ib_resolve_portid_str_via(&port_id, dr_path, IB_DEST_DRPATH,
@@ -327,12 +330,12 @@ main(int argc, char **argv)
}
if (resolved >= 0)
- if ((fabric = ibnd_discover_fabric(ibmad_port, &port_id,
+ if ((fabric = ibnd_discover_fabric(ctx, &port_id,
hops)) == NULL)
IBWARN("Single node discover failed; attempting full scan\n");
if (!fabric)
- if ((fabric = ibnd_discover_fabric(ibmad_port, NULL, -1)) == NULL) {
+ if ((fabric = ibnd_discover_fabric(ctx, NULL, -1)) == NULL) {
fprintf(stderr, "discover failed\n");
rc = 1;
goto close_port;
@@ -364,6 +367,7 @@ main(int argc, char **argv)
ibnd_destroy_fabric(fabric);
close_port:
+ ibnd_destroy_ctx(ctx);
close_node_name_map(node_name_map);
mad_rpc_close_port(ibmad_port);
exit(rc);
diff --git a/infiniband-diags/src/ibnetdiscover.c b/infiniband-diags/src/ibnetdiscover.c
index b04f2c6..ecb591e 100644
--- a/infiniband-diags/src/ibnetdiscover.c
+++ b/infiniband-diags/src/ibnetdiscover.c
@@ -65,6 +65,7 @@ static char *node_name_map_file = NULL;
static nn_map_t *node_name_map = NULL;
static int report_max_hops = 0;
+static int show_progress = 0;
/**
* Define our own conversion functions to maintain compatibility with the old
@@ -610,7 +611,7 @@ static int process_opt(void *context, int ch, char *optarg)
node_name_map_file = strdup(optarg);
break;
case 's':
- ibnd_show_progress(1);
+ show_progress = 1;
break;
case 'l':
list = LIST_CA_NODE | LIST_SWITCH_NODE | LIST_ROUTER_NODE;
@@ -643,6 +644,7 @@ static int process_opt(void *context, int ch, char *optarg)
int main(int argc, char **argv)
{
ibnd_fabric_t *fabric = NULL;
+ ibnd_ctx_t *ctx = NULL;
struct ibmad_port *ibmad_port;
int mgmt_classes[2] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS};
@@ -683,8 +685,14 @@ int main(int argc, char **argv)
IBERROR("can't open file %s for writing", argv[0]);
node_name_map = open_node_name_map(node_name_map_file);
+ ctx = ibnd_create_ctx(ibmad_port);
- if ((fabric = ibnd_discover_fabric(ibmad_port, NULL, -1)) == NULL)
+ if (!ctx)
+ IBERROR("failed to create libibnetdisc context\n");
+
+ ibnd_show_progress(ctx, show_progress);
+
+ if ((fabric = ibnd_discover_fabric(ctx, NULL, -1)) == NULL)
IBERROR("discover failed\n");
if (ports_report)
@@ -697,6 +705,7 @@ int main(int argc, char **argv)
dump_topology(group, fabric);
ibnd_destroy_fabric(fabric);
+ ibnd_destroy_ctx(ctx);
close_node_name_map(node_name_map);
mad_rpc_close_port(ibmad_port);
exit(0);
diff --git a/infiniband-diags/src/ibqueryerrors.c b/infiniband-diags/src/ibqueryerrors.c
index 2c85423..0955415 100644
--- a/infiniband-diags/src/ibqueryerrors.c
+++ b/infiniband-diags/src/ibqueryerrors.c
@@ -392,6 +392,7 @@ main(int argc, char **argv)
ib_portid_t portid = {0};
int rc = 0;
ibnd_fabric_t *fabric = NULL;
+ ibnd_ctx_t *ctx = NULL;
int mgmt_classes[4] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS, IB_PERFORMANCE_CLASS};
@@ -427,6 +428,8 @@ main(int argc, char **argv)
node_name_map = open_node_name_map(node_name_map_file);
+ ctx = ibnd_create_ctx(ibmad_port);
+
/* limit the scan the fabric around the target */
if (dr_path) {
if ((resolved = ib_resolve_portid_str_via(&portid, dr_path, IB_DEST_DRPATH,
@@ -440,12 +443,12 @@ main(int argc, char **argv)
}
if (resolved >= 0)
- if ((fabric = ibnd_discover_fabric(ibmad_port, &portid,
+ if ((fabric = ibnd_discover_fabric(ctx, &portid,
0)) == NULL)
IBWARN("Single node discover failed; attempting full scan\n");
if (!fabric) /* do a full scan */
- if ((fabric = ibnd_discover_fabric(ibmad_port, NULL, -1)) == NULL) {
+ if ((fabric = ibnd_discover_fabric(ctx, NULL, -1)) == NULL) {
fprintf(stderr, "discover failed\n");
rc = 1;
goto close_port;
@@ -479,6 +482,7 @@ main(int argc, char **argv)
ibnd_destroy_fabric(fabric);
close_port:
+ ibnd_destroy_ctx(ctx);
mad_rpc_close_port(ibmad_port);
close_node_name_map(node_name_map);
exit(rc);
--
1.5.4.5
More information about the general
mailing list