On 08:46 Mon 20 Jul     , Hal Rosenstock wrote:
> 

Any comment about what this patch is supposed to do?

> Signed-off-by: Robert Pearson <[email protected]>
> Signed-off-by: Hal Rosenstock <[email protected]>
> ---
> diff --git a/opensm/opensm/osm_mesh.c b/opensm/opensm/osm_mesh.c
> index 23fad87..a463ca9 100644
> --- a/opensm/opensm/osm_mesh.c
> +++ b/opensm/opensm/osm_mesh.c
> @@ -1272,6 +1272,80 @@ static int reorder_links(lash_t *p_lash, mesh_t *mesh)
>  }
>  
>  /*
> + * compare two switches in a sort
> + */
> +
> +/* Sort switches never gets called more than once so we can use a
> +   static structure to keep our context. */
> +static struct {
> +     lash_t *p_lash;
> +     mesh_t *mesh;
> +} sort_ctx;

This breaks reenterability.

Sasha

> +
> +static int compare_switch(const void *p1, const void *p2)
> +{
> +     int i, j, d;
> +     int dimension = sort_ctx.mesh->dimension;
> +     switch_t *s1 = sort_ctx.p_lash->switches[*(int *)p1];
> +     switch_t *s2 = sort_ctx.p_lash->switches[*(int *)p2];
> +
> +     for (i = 0; i < dimension; i++) {
> +             j = sort_ctx.mesh->dim_order[i];
> +             d = s1->node->coord[j] - s2->node->coord[j];
> +
> +             if (d > 0)
> +                     return 1;
> +
> +             if (d < 0)
> +                     return -1;
> +     }
> +
> +     return 0;
> +}
> +
> +/*
> + * sort_switches - reorder switch array in p_lash
> + */
> +static void sort_switches(lash_t *p_lash, mesh_t *mesh)
> +{
> +     int i, j;
> +     int num_switches = p_lash->num_switches;
> +     int *index, *reverse;
> +     switch_t *s;
> +     switch_t **switches;
> +
> +     index = calloc(num_switches, sizeof(int));
> +     reverse = calloc(num_switches, sizeof(int));
> +     switches = calloc(num_switches, sizeof(switch_t *));
> +
> +     for (i = 0; i < num_switches; i++)
> +             index[i] = i;
> +
> +     sort_ctx.mesh = mesh;
> +     sort_ctx.p_lash = p_lash;
> +     qsort(index, num_switches, sizeof(int), compare_switch);
> +
> +     for (i = 0; i < num_switches; i++)
> +             reverse[index[i]] = i;
> +
> +     for (i = 0; i < num_switches; i++) {
> +             s = p_lash->switches[index[i]];
> +             switches[i] = s;
> +             s->id = i;
> +             for (j = 0; j < s->node->num_links; j++)
> +                     s->node->links[j]->switch_id =
> +                             reverse[s->node->links[j]->switch_id];
> +     }
> +
> +     for (i = 0; i < num_switches; i++)
> +             p_lash->switches[i] = switches[i];
> +
> +     free(switches);
> +     free(index);
> +     free(reverse);
> +}
> +
> +/*
>   * osm_mesh_delete - free per mesh resources
>   */
>  static void mesh_delete(mesh_t *mesh)
> @@ -1470,6 +1544,8 @@ int osm_do_mesh_analysis(lash_t *p_lash)
>               if (reorder_links(p_lash, mesh))
>                       goto err;
>  
> +             sort_switches(p_lash, mesh);
> +
>               p = buf;
>               p += sprintf(p, "found ");
>               for (i = 0; i < mesh->dimension; i++)
> 
_______________________________________________
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