[ofa-general] Re: [PATCH] opensm: skeleton for toroidal mesh analysis

Sasha Khapyorsky sashak at voltaire.com
Sun Nov 30 05:30:26 PST 2008


Hi Bob,

On 00:44 Tue 11 Nov     , Robert Pearson wrote:
> Sasha, 
> 
> Here is the first patch in a series to implement the algorithm described in
> the file lash_changes.doc.
> 
> This patch
>       - creates a new command line flag --do_mesh_analysis and a new Boolean
> that is set if the flag is used.
>       - adds code to main to implement the flag and option.

This also requires addition in OpenSM man page and ideally some
explanations in opensm/doc/current-routing.txt document. This can be done
as separate patch if you like.

>       - creates a new file osm_mesh.c to hold the algorithm code
>       - moves declarations from osm_ucast_lash.c and osm_mesh.c into header
> files
>       - adds these files to Makefile.am
>       - adds a stub do_mesh_analysis() that is called from lash_core.
> 
> Signed-off-by: Bob Pearson <rpearson at systemfabricworks.com>
> 
> -----
> 
> diff --git a/opensm/include/opensm/osm_mesh.h
> b/opensm/include/opensm/osm_mesh.h
> new file mode 100644
> index 0000000..1467440
> --- /dev/null
> +++ b/opensm/include/opensm/osm_mesh.h
> @@ -0,0 +1,46 @@
> +/*
> + * Copyright (c) 2088      System Fabric Works, Inc.
> + *
> + * This software is available to you under a choice of one of two
> + * licenses.  You may choose to be licensed under the terms of the GNU
> + * General Public License (GPL) Version 2, available from the file
> + * COPYING in the main directory of this source tree, or the
> + * OpenIB.org BSD license below:
> + *
> + *     Redistribution and use in source and binary forms, with or
> + *     without modification, are permitted provided that the following
> + *     conditions are met:
> + *
> + *      - Redistributions of source code must retain the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer.
> + *
> + *      - Redistributions in binary form must reproduce the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer in the documentation and/or other materials
> + *        provided with the distribution.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
> + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
> + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> + * SOFTWARE.
> + *
> + */
> +
> +/*
> + * Abstract:
> + *      Declarations for mesh analysis
> + */
> +
> +#ifndef OSM_UCAST_MESH_H
> +#define OSM_UCAST_MESH_H
> +
> +struct _lash;
> +
> +int do_mesh_analysis(struct _lash *p_lash);
> +
> +#endif
> diff --git a/opensm/include/opensm/osm_subnet.h
> b/opensm/include/opensm/osm_subnet.h
> index 7259587..2abe36d 100644
> --- a/opensm/include/opensm/osm_subnet.h
> +++ b/opensm/include/opensm/osm_subnet.h
> @@ -215,6 +215,7 @@ typedef struct osm_subn_opt {
>  	char *node_name_map_name;
>  	char *prefix_routes_file;
>  	boolean_t consolidate_ipv6_snm_req;
> +	boolean_t do_mesh_analysis;
>  } osm_subn_opt_t;
>  /*
>  * FIELDS
> diff --git a/opensm/include/opensm/osm_ucast_lash.h
> b/opensm/include/opensm/osm_ucast_lash.h
> new file mode 100644
> index 0000000..646e9a3
> --- /dev/null
> +++ b/opensm/include/opensm/osm_ucast_lash.h
> @@ -0,0 +1,100 @@
> +/*
> + * Copyright (c) 2008      System Fabric Works, Inc.
> + * Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved.
> + * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved.
> + * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
> + * Copyright (c) 2007      Simula Research Laboratory. All rights reserved.
> + * Copyright (c) 2007      Silicon Graphics Inc. All rights reserved.
> + *
> + * This software is available to you under a choice of one of two
> + * licenses.  You may choose to be licensed under the terms of the GNU
> + * General Public License (GPL) Version 2, available from the file
> + * COPYING in the main directory of this source tree, or the
> + * OpenIB.org BSD license below:
> + *
> + *     Redistribution and use in source and binary forms, with or
> + *     without modification, are permitted provided that the following
> + *     conditions are met:
> + *
> + *      - Redistributions of source code must retain the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer.
> + *
> + *      - Redistributions in binary form must reproduce the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer in the documentation and/or other materials
> + *        provided with the distribution.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
> + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
> + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> + * SOFTWARE.
> + *
> + */
> +
> +/*
> + * Abstract:
> + *      Declarations for LASH algorithm
> + */
> +
> +#ifndef OSM_UCAST_LASH_H
> +#define OSM_UCAST_LASH_H
> +
> +enum {
> +	UNQUEUED,
> +	Q_MEMBER,
> +	MST_MEMBER,
> +	MAX_INT = 9999,
> +	NONE = MAX_INT
> +};
> +
> +typedef struct _cdg_vertex {
> +	int num_dependencies;
> +	struct _cdg_vertex **dependency;
> +	int from;
> +	int to;
> +	int seen;
> +	int temp;
> +	int visiting_number;
> +	struct _cdg_vertex *next;
> +	int num_temp_depend;
> +	int num_using_vertex;
> +	int *num_using_this_depend;
> +} cdg_vertex_t;
> +
> +typedef struct _reachable_dest {
> +	int switch_id;
> +	struct _reachable_dest *next;
> +} reachable_dest_t;
> +
> +typedef struct _switch {
> +	osm_switch_t *p_sw;
> +	int *dij_channels;
> +	int id;
> +	int used_channels;
> +	int q_state;
> +	struct routing_table {
> +		unsigned out_link;
> +		unsigned lane;
> +	} *routing_table;
> +	unsigned int num_connections;
> +	int *virtual_physical_port_table;
> +	int *phys_connections;
> +} switch_t;
> +
> +typedef struct _lash {
> +	osm_opensm_t *p_osm;
> +	int num_switches;
> +	uint8_t vl_min;
> +	int balance_limit;
> +	switch_t **switches;
> +	cdg_vertex_t ****cdg_vertex_matrix;
> +	int *num_mst_in_lane;
> +	int ***virtual_location;
> +} lash_t;
> +
> +#endif
> diff --git a/opensm/opensm/Makefile.am b/opensm/opensm/Makefile.am
> index 01573d2..7b9da18 100644
> --- a/opensm/opensm/Makefile.am
> +++ b/opensm/opensm/Makefile.am
> @@ -31,7 +31,7 @@ opensm_SOURCES = main.c osm_console_io.c osm_console.c
> osm_db_files.c \
>  		 osm_inform.c osm_lid_mgr.c osm_lin_fwd_rcv.c \
>  		 osm_link_mgr.c osm_mcast_fwd_rcv.c \
>  		 osm_mcast_mgr.c osm_mcast_tbl.c osm_mcm_info.c \
> -		 osm_mcm_port.c osm_mtree.c osm_multicast.c osm_node.c \
> +		 osm_mcm_port.c osm_mesh.c osm_mtree.c osm_multicast.c
> osm_node.c \
>  		 osm_node_desc_rcv.c osm_node_info_rcv.c \
>  		 osm_opensm.c osm_pkey.c osm_pkey_mgr.c osm_pkey_rcv.c \
>  		 osm_port.c osm_port_info_rcv.c \
> @@ -76,6 +76,7 @@ opensminclude_HEADERS = \
>  	$(srcdir)/../include/opensm/osm_errors.h \
>  	$(srcdir)/../include/opensm/osm_helper.h \
>  	$(srcdir)/../include/opensm/osm_inform.h \
> +	$(srcdir)/../include/opensm/osm_ucast_lash.h \
>  	$(srcdir)/../include/opensm/osm_lid_mgr.h \
>  	$(srcdir)/../include/opensm/osm_log.h \
>  	$(srcdir)/../include/opensm/osm_mad_pool.h \
> @@ -83,6 +84,7 @@ opensminclude_HEADERS = \
>  	$(srcdir)/../include/opensm/osm_mcast_tbl.h \
>  	$(srcdir)/../include/opensm/osm_mcm_info.h \
>  	$(srcdir)/../include/opensm/osm_mcm_port.h \
> +	$(srcdir)/../include/opensm/osm_mesh.h \
>  	$(srcdir)/../include/opensm/osm_mtree.h \
>  	$(srcdir)/../include/opensm/osm_multicast.h \
>  	$(srcdir)/../include/opensm/osm_msgdef.h \
> diff --git a/opensm/opensm/main.c b/opensm/opensm/main.c
> index 53648d6..63bd5a6 100644
> --- a/opensm/opensm/main.c
> +++ b/opensm/opensm/main.c
> @@ -585,6 +585,7 @@ int main(int argc, char *argv[])
>  #endif
>  		{"prefix_routes_file", 1, NULL, 3},
>  		{"consolidate_ipv6_snm_req", 0, NULL, 4},
> +		{"do_mesh_analysis", 0, NULL, 5},

A new command line option requires addition (and some short explanation)
in usage() function (invoked on 'opensm --help') and in OpenSM man page.

Also I suppose this option should be added to OpenSM config file and not
to be "command line only".

>  		{NULL, 0, NULL, 0}	/* Required at the end of the array
> */
>  	};
>  
> @@ -922,6 +923,9 @@ int main(int argc, char *argv[])
>  		case 4:
>  			opt.consolidate_ipv6_snm_req = TRUE;
>  			break;
> +		case 5:
> +			opt.do_mesh_analysis = TRUE;
> +			break;
>  		case 'h':
>  		case '?':
>  		case ':':
> diff --git a/opensm/opensm/osm_mesh.c b/opensm/opensm/osm_mesh.c
> new file mode 100644
> index 0000000..7943274
> --- /dev/null
> +++ b/opensm/opensm/osm_mesh.c
> @@ -0,0 +1,65 @@
> +/*
> + * Copyright (c) 2008      System Fabric Works, Inc.
> + *
> + * This software is available to you under a choice of one of two
> + * licenses.  You may choose to be licensed under the terms of the GNU
> + * General Public License (GPL) Version 2, available from the file
> + * COPYING in the main directory of this source tree, or the
> + * OpenIB.org BSD license below:
> + *
> + *     Redistribution and use in source and binary forms, with or
> + *     without modification, are permitted provided that the following
> + *     conditions are met:
> + *
> + *      - Redistributions of source code must retain the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer.
> + *
> + *      - Redistributions in binary form must reproduce the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer in the documentation and/or other materials
> + *        provided with the distribution.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
> + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
> + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> + * SOFTWARE.
> + *
> + */
> +
> +/*
> + * Abstract:
> + *      routines to analyze certain meshes
> + */
> +
> +#if HAVE_CONFIG_H
> +#  include <config.h>
> +#endif				/* HAVE_CONFIG_H */
> +
> +#include <stdio.h>
> +#include <opensm/osm_switch.h>
> +#include <opensm/osm_opensm.h>
> +#include <opensm/osm_log.h>
> +#include <opensm/osm_mesh.h>
> +#include <opensm/osm_ucast_lash.h>
> +
> +/*
> + * do_mesh_analysis
> + */
> +int do_mesh_analysis(lash_t *p_lash)
> +{
> +	int ret = 0;
> +	osm_log_t *p_log = &p_lash->p_osm->log;
> +
> +	OSM_LOG_ENTER(p_log);
> +
> +	printf("lash: do_mesh_analysis stub called\n");
> +
> +	OSM_LOG_EXIT(p_log);
> +
> +	return ret;
> +}
> diff --git a/opensm/opensm/osm_ucast_lash.c b/opensm/opensm/osm_ucast_lash.c
> index c082798..e10371c 100644
> --- a/opensm/opensm/osm_ucast_lash.c
> +++ b/opensm/opensm/osm_ucast_lash.c
> @@ -52,64 +52,13 @@
>  #include <opensm/osm_switch.h>
>  #include <opensm/osm_opensm.h>
>  #include <opensm/osm_log.h>
> +#include <opensm/osm_mesh.h>
> +#include <opensm/osm_ucast_lash.h>
>  
>  /* //////////////////////////// */
>  /*  Local types                 */
>  /* //////////////////////////// */
>  
> -enum {
> -	UNQUEUED,
> -	Q_MEMBER,
> -	MST_MEMBER,
> -	MAX_INT = 9999,
> -	NONE = MAX_INT
> -};
> -
> -typedef struct _cdg_vertex {
> -	int num_dependencies;
> -	struct _cdg_vertex **dependency;
> -	int from;
> -	int to;
> -	int seen;
> -	int temp;
> -	int visiting_number;
> -	struct _cdg_vertex *next;
> -	int num_temp_depend;
> -	int num_using_vertex;
> -	int *num_using_this_depend;
> -} cdg_vertex_t;
> -
> -typedef struct _reachable_dest {
> -	int switch_id;
> -	struct _reachable_dest *next;
> -} reachable_dest_t;
> -
> -typedef struct _switch {
> -	osm_switch_t *p_sw;
> -	int *dij_channels;
> -	int id;
> -	int used_channels;
> -	int q_state;
> -	struct routing_table {
> -		unsigned out_link;
> -		unsigned lane;
> -	} *routing_table;
> -	unsigned int num_connections;
> -	int *virtual_physical_port_table;
> -	int *phys_connections;
> -} switch_t;
> -
> -typedef struct _lash {
> -	osm_opensm_t *p_osm;
> -	int num_switches;
> -	uint8_t vl_min;
> -	int balance_limit;
> -	switch_t **switches;
> -	cdg_vertex_t ****cdg_vertex_matrix;
> -	int *num_mst_in_lane;
> -	int ***virtual_location;
> -} lash_t;
> -
>  static cdg_vertex_t *create_cdg_vertex(unsigned num_switches)
>  {
>  	cdg_vertex_t *cdg_vertex = (cdg_vertex_t *)
> malloc(sizeof(cdg_vertex_t));
> @@ -872,10 +821,15 @@ static int lash_core(lash_t * p_lash)
>  	int output_link2, i_next_switch2;
>  	int cycle_found2 = 0;
>  	int status = 0;
> -	int *switch_bitmap;	/* Bitmap to check if we have processed this
> pair */
> +	int *switch_bitmap = NULL;	/* Bitmap to check if we have
> processed this pair */

Why this initialization is needed?

>  
>  	OSM_LOG_ENTER(p_log);
>  
> +	if (p_lash->p_osm->subn.opt.do_mesh_analysis &&
> do_mesh_analysis(p_lash)) {
> +		OSM_LOG(p_log, OSM_LOG_ERROR, "Mesh analysis failed\n");
> +		goto Exit;
> +	}
> +
>  	for (i = 0; i < num_switches; i++) {
>  
>  		shortest_path(p_lash, i);



More information about the general mailing list