Skip to contentSkip to conversation

ibnetdiscover: fix error when discovery started on node with more that one port

PATCH In review Eli Dorfman (Voltaire) 2 participants 2 messages Oct 4, 2010 1 message not in the archive InfiniBand

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ibnetdiscover: fix error when discovery started on node with more that one port

When discovery is started on a node with more than one active port it tries to send mads from second Hca port and fails.
ibnetdiscover should not try and extend_path from Hca except for starting point.

---
 .../libibnetdisc/include/infiniband/ibnetdisc.h    |    1 +
 infiniband-diags/libibnetdisc/src/ibnetdisc.c      |    7 ++++---
 2 files changed, 5 insertions(+), 3 deletions(-)
infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h +1 -0
index cfd3bbe..fe953e6 100644
@@ -149,6 +149,7 @@ typedef struct ibnd_fabric {
 	 * or by default the node you ar running on
 	 */
 	ibnd_node_t *from_node;
+	int from_port;
 	/* NULL term list of all nodes in the fabric */
 	ibnd_node_t *nodes;
 	/* NULL terminated list of all chassis found in the fabric */
infiniband-diags/libibnetdisc/src/ibnetdisc.c +4 -3
index f525d71..64e1c60 100644
@@ -199,7 +199,7 @@ static int recv_port_info(smp_engine_t * engine, ibnd_smp_t * smp,
 	if (port_num && mad_get_field(port->info, 0, IB_PORT_PHYS_STATE_F)
 	    == IB_PORT_PHYS_STATE_LINKUP
 	    && ((node->type == IB_NODE_SWITCH && port_num != local_port) ||
-		(node == fabric->from_node && port_num == local_port))) {
+		(node == fabric->from_node && port_num == fabric->from_port))) {
 		ib_portid_t path = smp->path;
 		if (extend_dpath(engine, &path, port_num) > 0)
 			query_node_info(engine, &path, node);
@@ -324,9 +324,10 @@ static int recv_node_info(smp_engine_t * engine, ibnd_smp_t * smp,
 		dump_endnode(&smp->path, node_is_new ? "new" : "known",
 			     node, port);
 
-	if (rem_node == NULL)	/* this is the start node */
+	if (rem_node == NULL) {	/* this is the start node */
 		fabric->from_node = node;
-	else {
+		fabric->from_port = port_num;
+	} else {
 		/* link ports... */
 		int rem_port_num = get_last_port(&smp->path);
 
Signature · 6 lines
1.7.2.1

--
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

A message that is not in the archive (sent off-list or not yet received): [email protected]

#2 lore raw

Eli,

Isn't this the same as what I submitted back on 8/25 and subsequently applied (http://www.spinics.net/lists/linux-rdma/msg05590.html) ?

-- Hal

Quoted 52 lines · Eli Dorfman (Voltaire)

When discovery is started on a node with more than one active port it tries to send mads from second Hca port and fails.
ibnetdiscover should not try and extend_path from Hca except for starting point.

---
 .../libibnetdisc/include/infiniband/ibnetdisc.h    |    1 + infiniband-diags/libibnetdisc/src/ibnetdisc.c      |    7 ++++---

 2 files changed, 5 insertions(+), 3 deletions(-)
infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h +1 -0
index cfd3bbe..fe953e6 100644
@@ -149,6 +149,7 @@ typedef struct ibnd_fabric {
         * or by default the node you ar running on
         */
        ibnd_node_t *from_node;
+       int from_port;
        /* NULL term list of all nodes in the fabric */
        ibnd_node_t *nodes;
        /* NULL terminated list of all chassis found in the fabric */
infiniband-diags/libibnetdisc/src/ibnetdisc.c +0 -0
index f525d71..64e1c60 100644
@@ -199,7 +199,7 @@ static int recv_port_info(smp_engine_t * engine, ibnd_smp_t * smp,
        if (port_num && mad_get_field(port->info, 0, IB_PORT_PHYS_STATE_F)

           == IB_PORT_PHYS_STATE_LINKUP
           && ((node->type == IB_NODE_SWITCH && port_num != local_port) ||
-               (node == fabric->from_node && port_num == local_port))) {
+               (node == fabric->from_node && port_num == fabric->from_port))) { ib_portid_t path = smp->path;
               if (extend_dpath(engine, &path, port_num) > 0) query_node_info(engine, &path, node);

infiniband-diags/libibnetdisc/src/ibnetdisc.c +3 -3
@@ -324,9 +324,10 @@ static int recv_node_info(smp_engine_t * engine, ibnd_smp_t * smp,
                dump_endnode(&smp->path, node_is_new ? "new" : "known",
                             node, port);
 
-       if (rem_node == NULL)   /* this is the start node */
+       if (rem_node == NULL) { /* this is the start node */
                fabric->from_node = node;
-       else {
+               fabric->from_port = port_num;
+       } else {
                /* link ports... */
                int rem_port_num = get_last_port(&smp->path);
 
--

1.7.2.1

Quoted 5 lines

--
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

--
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