Simplify mesh node links and ports allocation - use zero sized arrays
and alloc node and link structures as single memory chunk.

Signed-off-by: Sasha Khapyorsky <[email protected]>
---
 opensm/include/opensm/osm_mesh.h |    8 ++++----
 opensm/opensm/osm_mesh.c         |   24 ++++++------------------
 2 files changed, 10 insertions(+), 22 deletions(-)

diff --git a/opensm/include/opensm/osm_mesh.h b/opensm/include/opensm/osm_mesh.h
index 9e23498..173fa86 100644
--- a/opensm/include/opensm/osm_mesh.h
+++ b/opensm/include/opensm/osm_mesh.h
@@ -48,17 +48,15 @@ struct _switch;
 typedef struct _link {
        int switch_id;
        int link_id;
-       int *ports;
-       int num_ports;
        int next_port;
+       int num_ports;
+       int ports[0];
 } link_t;
 
 /*
  * per switch node mesh info
  */
 typedef struct _mesh_node {
-       unsigned int num_links;         /* number of 'links' to adjacent 
switches */
-       link_t **links;                 /* per link information */
        int *axes;                      /* used to hold and reorder assigned 
axes */
        int *coord;                     /* mesh coordinates of switch */
        int **matrix;                   /* distances between adjacant switches 
*/
@@ -67,6 +65,8 @@ typedef struct _mesh_node {
        int dimension;                  /* apparent dimension of mesh around 
node */
        int temp;                       /* temporary holder for distance info */
        int type;                       /* index of node type in mesh_info 
array */
+       unsigned int num_links;         /* number of 'links' to adjacent 
switches */
+       link_t *links[0];               /* per link information */
 } mesh_node_t;
 
 void osm_mesh_node_delete(struct _lash *p_lash, struct _switch *sw);
diff --git a/opensm/opensm/osm_mesh.c b/opensm/opensm/osm_mesh.c
index 9e3e9de..263d29e 100644
--- a/opensm/opensm/osm_mesh.c
+++ b/opensm/opensm/osm_mesh.c
@@ -1253,16 +1253,9 @@ void osm_mesh_node_delete(lash_t *p_lash, switch_t *sw)
        OSM_LOG_ENTER(p_log);
 
        if (node) {
-               if (node->links) {
-                       for (i = 0; i < num_ports; i++) {
-                               if (node->links[i]) {
-                                       if (node->links[i]->ports)
-                                               free(node->links[i]->ports);
-                                       free(node->links[i]);
-                               }
-                       }
-                       free(node->links);
-               }
+               for (i = 0; i < num_ports; i++)
+                       if (node->links[i])
+                               free(node->links[i]);
 
                if (node->poly)
                        free(node->poly);
@@ -1301,17 +1294,12 @@ int osm_mesh_node_create(lash_t *p_lash, switch_t *sw)
 
        OSM_LOG_ENTER(p_log);
 
-       if (!(node = sw->node = calloc(1, sizeof(mesh_node_t))))
+       if (!(node = sw->node = calloc(1, sizeof(mesh_node_t) + num_ports * 
sizeof(link_t *))))
                goto err;
 
-       if (!(node->links = calloc(num_ports, sizeof(link_t *))))
-               goto err;
-
-       for (i = 0; i < num_ports; i++) {
-               if (!(node->links[i] = calloc(1, sizeof(link_t))) ||
-                   !(node->links[i]->ports = calloc(num_ports, sizeof(int))))
+       for (i = 0; i < num_ports; i++)
+               if (!(node->links[i] = calloc(1, sizeof(link_t) + num_ports * 
sizeof(int))))
                        goto err;
-       }
 
        if (!(node->axes = calloc(num_ports, sizeof(int))))
                goto err;
-- 
1.6.0.4.766.g6fc4a

_______________________________________________
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

Reply via email to