From: Dan Ben Yosef <[email protected]>

This patch avoids pushing the same pointer to the hash table that causes
endless loop during dumping.

Signed-off-by: Dan Ben Yosef <[email protected]>
Signed-off-by: Hal Rosenstock <[email protected]>
---
 libibnetdisc/src/ibnetdisc.c       |   39 ++++++++++++++++++++++++++++++++---
 libibnetdisc/src/ibnetdisc_cache.c |   19 ++++++++++++++--
 libibnetdisc/src/internal.h        |    4 +-
 3 files changed, 53 insertions(+), 9 deletions(-)

diff --git a/libibnetdisc/src/ibnetdisc.c b/libibnetdisc/src/ibnetdisc.c
index e0f2d78..938a516 100644
--- a/libibnetdisc/src/ibnetdisc.c
+++ b/libibnetdisc/src/ibnetdisc.c
@@ -353,7 +353,12 @@ static int recv_port_info(smp_engine_t * engine, 
ibnd_smp_t * smp,
                port->lmc = node->smalmc;
        }
 
-       add_to_portguid_hash(port, f_int->fabric.portstbl);
+       int rc1 = add_to_portguid_hash(port, f_int->fabric.portstbl);
+       if (rc1)
+               IBND_ERROR("Error Occurred when trying"
+                          " to insert new port guid 0x%016" PRIx64 " to DB\n",
+                          port->guid);
+
        add_to_portlid_hash(port, f_int->lid2guid);
 
        if ((scan->cfg->flags & IBND_CONFIG_MLX_EPI)
@@ -458,7 +463,11 @@ static ibnd_node_t *create_node(smp_engine_t * engine, 
ib_portid_t * path,
        rc->path_portid = *path;
        memcpy(rc->info, node_info, sizeof(rc->info));
 
-       add_to_nodeguid_hash(rc, f_int->fabric.nodestbl);
+       int rc1 = add_to_nodeguid_hash(rc, f_int->fabric.nodestbl);
+       if (rc1)
+               IBND_ERROR("Error Occurred when trying"
+                          " to insert new node guid 0x%016" PRIx64 " to DB\n",
+                          rc->guid);
 
        /* add this to the all nodes list */
        rc->next = f_int->fabric.nodes;
@@ -607,20 +616,42 @@ ibnd_node_t *ibnd_find_node_dr(ibnd_fabric_t * fabric, 
char *dr_str)
        return rc->node;
 }
 
-void add_to_nodeguid_hash(ibnd_node_t * node, ibnd_node_t * hash[])
+int add_to_nodeguid_hash(ibnd_node_t * node, ibnd_node_t * hash[])
 {
+       int rc = 0;
+       ibnd_node_t *tblnode;
        int hash_idx = HASHGUID(node->guid) % HTSZ;
 
+       for (tblnode = hash[hash_idx]; tblnode; tblnode = tblnode->htnext) {
+               if (tblnode == node) {
+                       IBND_ERROR("Duplicate Node: Node with guid 0x%016"
+                                  PRIx64 " already exists in nodes DB\n",
+                                  node->guid);
+                       return 1;
+               }
+       }
        node->htnext = hash[hash_idx];
        hash[hash_idx] = node;
+       return rc;
 }
 
-void add_to_portguid_hash(ibnd_port_t * port, ibnd_port_t * hash[])
+int add_to_portguid_hash(ibnd_port_t * port, ibnd_port_t * hash[])
 {
+       int rc = 0;
+       ibnd_port_t *tblport;
        int hash_idx = HASHGUID(port->guid) % HTSZ;
 
+       for (tblport = hash[hash_idx]; tblport; tblport = tblport->htnext) {
+               if (tblport == port) {
+                       IBND_ERROR("Duplicate Port: Port with guid 0x%016"
+                                  PRIx64 " already exists in ports DB\n",
+                                  port->guid);
+                       return 1;
+               }
+       }
        port->htnext = hash[hash_idx];
        hash[hash_idx] = port;
+       return rc;
 }
 
 void create_lid2guid(f_internal_t *f_int)
diff --git a/libibnetdisc/src/ibnetdisc_cache.c 
b/libibnetdisc/src/ibnetdisc_cache.c
index d4663bf..94dd004 100644
--- a/libibnetdisc/src/ibnetdisc_cache.c
+++ b/libibnetdisc/src/ibnetdisc_cache.c
@@ -515,7 +515,13 @@ static int _fill_port(ibnd_fabric_cache_t * fabric_cache, 
ibnd_node_t * node,
        /* achu: needed if user wishes to re-cache a loaded fabric.
         * Otherwise, mostly unnecessary to do this.
         */
-       add_to_portguid_hash(port_cache->port, 
fabric_cache->f_int->fabric.portstbl);
+       int rc = add_to_portguid_hash(port_cache->port,
+                                     fabric_cache->f_int->fabric.portstbl);
+       if (rc) {
+               IBND_DEBUG("Error Occurred when trying"
+                          " to insert new port guid 0x%016" PRIx64 " to DB\n",
+                          port_cache->port->guid);
+       }
        return 0;
 }
 
@@ -538,8 +544,15 @@ static int _rebuild_nodes(ibnd_fabric_cache_t * 
fabric_cache)
                node->next = fabric_cache->f_int->fabric.nodes;
                fabric_cache->f_int->fabric.nodes = node;
 
-               add_to_nodeguid_hash(node_cache->node,
-                                    fabric_cache->f_int->fabric.nodestbl);
+               int rc = add_to_nodeguid_hash(node_cache->node,
+                                             fabric_cache->
+                                             f_int->
+                                             fabric.nodestbl);
+               if (rc) {
+                       IBND_DEBUG("Error Occurred when trying"
+                                  " to insert new node guid 0x%016" PRIx64 " 
to DB\n",
+                                  node_cache->node->guid);
+               }
 
                add_to_type_list(node_cache->node, fabric_cache->f_int);
 
diff --git a/libibnetdisc/src/internal.h b/libibnetdisc/src/internal.h
index a50d2d7..5a32cd2 100644
--- a/libibnetdisc/src/internal.h
+++ b/libibnetdisc/src/internal.h
@@ -106,9 +106,9 @@ int issue_smp(smp_engine_t * engine, ib_portid_t * portid,
 int process_mads(smp_engine_t * engine);
 void smp_engine_destroy(smp_engine_t * engine);
 
-void add_to_nodeguid_hash(ibnd_node_t * node, ibnd_node_t * hash[]);
+int add_to_nodeguid_hash(ibnd_node_t * node, ibnd_node_t * hash[]);
 
-void add_to_portguid_hash(ibnd_port_t * port, ibnd_port_t * hash[]);
+int add_to_portguid_hash(ibnd_port_t * port, ibnd_port_t * hash[]);
 void add_to_portlid_hash(ibnd_port_t * port, GHashTable *htable);
 
 void add_to_type_list(ibnd_node_t * node, f_internal_t * fabric);
-- 
1.7.8.2

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