[ofa-general] Re: [PATCH] opensm/osm_mesh.c: Reorder switches for lash

Sasha Khapyorsky sashak at voltaire.com
Mon Jul 20 10:16:34 PDT 2009


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

Any comment about what this patch is supposed to do?

> Signed-off-by: Robert Pearson <rpearson at systemfabricworks.com>
> Signed-off-by: Hal Rosenstock <hal.rosenstock at gmail.com>
> ---
> 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++)
> 



More information about the general mailing list