From: Ira Weiny <[email protected]>
Date: Fri, 30 Jul 2010 14:26:39 -0700
Subject: [PATCH] ibnetdisc.c: Fix partial scan of the fabric.

   When max_hops was specified it did not result in a correct limited scan of
   the fabric.
   In addition the -S and -D options of iblinkinfo/ibqueryerrors should by
   default only scan 1 hop from the node specified to allow for faster
   processing.

Signed-off-by: Ira Weiny <[email protected]>
---
 infiniband-diags/libibnetdisc/src/ibnetdisc.c |   17 ++++++++++-------
 infiniband-diags/src/iblinkinfo.c             |   13 ++++++++-----
 infiniband-diags/src/ibqueryerrors.c          |   11 +++++++----
 3 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/infiniband-diags/libibnetdisc/src/ibnetdisc.c 
b/infiniband-diags/libibnetdisc/src/ibnetdisc.c
index f525d71..83353b1 100644
--- a/infiniband-diags/libibnetdisc/src/ibnetdisc.c
+++ b/infiniband-diags/libibnetdisc/src/ibnetdisc.c
@@ -93,7 +93,7 @@ static int extend_dpath(smp_engine_t * engine, ib_portid_t * 
portid,
        ibnd_fabric_t *fabric = scan->fabric;
 
        if (scan->cfg->max_hops &&
-           fabric->maxhops_discovered >= scan->cfg->max_hops)
+           fabric->maxhops_discovered > scan->cfg->max_hops)
                return 0;
 
        if (portid->lid) {
@@ -449,7 +449,8 @@ void add_to_type_list(ibnd_node_t * node, ibnd_fabric_t * 
fabric)
        }
 }
 
-static int set_config(struct ibnd_config *config, struct ibnd_config *cfg)
+static int set_config(struct ibnd_config *config, struct ibnd_config *cfg,
+                     int initial_hops)
 {
        if (!config)
                return (-EINVAL);
@@ -463,6 +464,8 @@ static int set_config(struct ibnd_config *config, struct 
ibnd_config *cfg)
                config->timeout_ms = DEFAULT_TIMEOUT;
        if (!config->retries)
                config->retries = DEFAULT_RETRIES;
+       if (config->max_hops)
+               config->max_hops += initial_hops;
 
        return (0);
 }
@@ -479,15 +482,15 @@ ibnd_fabric_t *ibnd_discover_fabric(char * ca_name, int 
ca_port,
        int nc = 2;
        int mc[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
 
-       if (set_config(&config, cfg)) {
-               IBND_ERROR("Invalid ibnd_config\n");
-               return NULL;
-       }
-
        /* If not specified start from "my" port */
        if (!from)
                from = &my_portid;
 
+       if (set_config(&config, cfg, from->drpath.cnt)) {
+               IBND_ERROR("Invalid ibnd_config\n");
+               return NULL;
+       }
+
        fabric = calloc(1, sizeof(*fabric));
        if (!fabric) {
                IBND_ERROR("OOM: failed to calloc ibnd_fabric_t\n");
diff --git a/infiniband-diags/src/iblinkinfo.c 
b/infiniband-diags/src/iblinkinfo.c
index d0c9b13..b075fd0 100644
--- a/infiniband-diags/src/iblinkinfo.c
+++ b/infiniband-diags/src/iblinkinfo.c
@@ -371,11 +371,14 @@ int main(int argc, char **argv)
                        exit(1);
                }
        } else {
-               if (resolved >= 0 &&
-                   !(fabric =
-                     ibnd_discover_fabric(ibd_ca, ibd_ca_port, &port_id, 
&config)))
-                       IBWARN("Single node discover failed;"
-                              " attempting full scan\n");
+               if (resolved >= 0) {
+                       if (!config.max_hops)
+                               config.max_hops = 1;
+                       if (!(fabric =
+                           ibnd_discover_fabric(ibd_ca, ibd_ca_port, &port_id, 
&config)))
+                               IBWARN("Single node discover failed;"
+                                      " attempting full scan\n");
+               }
 
                if (!fabric &&
                    !(fabric = ibnd_discover_fabric(ibd_ca, ibd_ca_port, NULL, 
&config))) {
diff --git a/infiniband-diags/src/ibqueryerrors.c 
b/infiniband-diags/src/ibqueryerrors.c
index e0b1c0b..4317b67 100644
--- a/infiniband-diags/src/ibqueryerrors.c
+++ b/infiniband-diags/src/ibqueryerrors.c
@@ -655,11 +655,14 @@ int main(int argc, char **argv)
                        exit(1);
                }
        } else {
-               if (resolved >= 0 &&
-                   !(fabric = ibnd_discover_fabric(ibd_ca, ibd_ca_port,
+               if (resolved >= 0) {
+                       if (!config.max_hops)
+                               config.max_hops = 1;
+                       if (!(fabric = ibnd_discover_fabric(ibd_ca, ibd_ca_port,
                                                    &portid, &config)))
-                       IBWARN("Single node discover failed;"
-                              " attempting full scan");
+                               IBWARN("Single node discover failed;"
+                                      " attempting full scan");
+               }
 
                if (!fabric && !(fabric = ibnd_discover_fabric(ibd_ca,
                                                               ibd_ca_port,
-- 
1.5.4.5

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to