[ofa-general] Re: [PATCH v2] opensm/osm_console.c : Added dump_portguid function to console to generate a list of port guids matching one or more regexps

Sasha Khapyorsky sashak at voltaire.com
Wed Feb 11 10:47:17 PST 2009


Hi Nicolas,

On 09:08 Tue 10 Feb     , Nicolas Morey Chaisemartin wrote:
> This add a dump_portguid functionnality to openSM console which makes it 
> really easy to generate cn_guid_file, root_guid_file and such
> by dumping into a file all port guids whom nodedesc contains at least one 
> of the provided regexps
>
> Signed-off-by: Nicolas Morey-Chaisemartin 
> <nicolas.morey-chaisemartin at ext.bull.net>
> ---
>
> Repost without exit_after_run flag, active sleep init loop and indented.
>
>  opensm/opensm/osm_console.c |  105 
> +++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 105 insertions(+), 0 deletions(-)
>
>

> diff --git a/opensm/opensm/osm_console.c b/opensm/opensm/osm_console.c
> index c6e8e59..5fbcd43 100644
> --- a/opensm/opensm/osm_console.c
> +++ b/opensm/opensm/osm_console.c
> @@ -42,6 +42,7 @@
>  #include <sys/types.h>
>  #include <sys/socket.h>
>  #include <netdb.h>
> +#include <regex.h>
>  #ifdef ENABLE_OSM_CONSOLE_SOCKET
>  #include <arpa/inet.h>
>  #endif
> @@ -1173,6 +1174,109 @@ static void version_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
>  }
>  
>  /* more parse routines go here */
> +typedef struct _regexp_list {
> +	regex_t exp;
> +	struct _regexp_list *next;
> +} regexp_list_t;
> +
> +static void dump_portguid_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
> +{
> +	cl_qmap_t *p_port_guid_tbl;
> +	osm_port_t *p_port;
> +	osm_port_t *p_next_port;
> +
> +	regexp_list_t *p_head_regexp = NULL;
> +	regexp_list_t *p_regexp;
> +
> +	/* Option variables */
> +	char *p_cmd = NULL;
> +	FILE *output = out;
> +
> +	/* Read commande line */
> +
> +	while (1) {
> +		p_cmd = next_token(p_last);
> +		if (p_cmd) {
> +			if (strcmp(p_cmd, "file") == 0) {
> +				p_cmd = next_token(p_last);
> +				if (p_cmd) {
> +					output = fopen(p_cmd, "w+");
> +					if (output == NULL) {
> +						fprintf(out,
> +							"Could not open file %s: %s\n",
> +							p_cmd, strerror(errno));
> +						output = out;
> +					}
> +				} else
> +					fprintf(out, "No file name passed\n");
> +			} else {
> +				p_regexp = malloc(sizeof(*p_regexp));
> +				if (regcomp
> +				    (&(p_regexp->exp), p_cmd,
> +				     REG_NOSUB | REG_EXTENDED) != 0) {
> +					fprintf(out,
> +						"Couldn't parse regular expression %s. Skipping it.\n",
> +						p_cmd);
> +				}
> +				p_regexp->next = p_head_regexp;
> +				p_head_regexp = p_regexp;
> +			}
> +		} else
> +			break;	/* No more tokens */
> +
> +	}
> +
> +	/* Check we have at least one expression to match */
> +	if (p_head_regexp == NULL) {
> +		fprintf(out, "No valid expression provided. Aborting\n");
> +		return;
> +	}
> +
> +	cl_spinlock_release(&p_osm->sm.state_lock);

What is this cl_spinlock_release()? Typo?

> +	if (p_osm->sm.p_subn->need_update != 0) {
> +		fprintf(out, "Subnet is not ready yet. Try again later.\n");
> +		return;
> +	}
> +
> +	/* Subnet doesn't need to be updated so we can carry on */
> +
> +	CL_PLOCK_EXCL_ACQUIRE(p_osm->sm.p_lock);
> +	p_port_guid_tbl = &(p_osm->sm.p_subn->port_guid_tbl);

Do we really need exclusive locking here? port_guid_table content is
rad-only, I guess "read-only" lock (CL_PLOCK_ACQUIRE()) should be enough.

The rest looks fine for me.

Sasha

> +
> +	p_next_port = (osm_port_t *) cl_qmap_head(p_port_guid_tbl);
> +	while (p_next_port != (osm_port_t *) cl_qmap_end(p_port_guid_tbl)) {
> +
> +		p_port = p_next_port;
> +		p_next_port =
> +		    (osm_port_t *) cl_qmap_next(&p_next_port->map_item);
> +
> +		for (p_regexp = p_head_regexp; p_regexp != NULL;
> +		     p_regexp = p_regexp->next)
> +			if (regexec
> +			    (&(p_regexp->exp), p_port->p_node->print_desc, 0,
> +			     NULL, 0) == 0)
> +				fprintf(output, "0x%" PRIxLEAST64 "\n",
> +					cl_ntoh64(p_port->p_physp->port_guid));
> +	}
> +
> +	CL_PLOCK_RELEASE(p_osm->sm.p_lock);
> +	if (output != out)
> +		fclose(output);
> +
> +}
> +
> +static void help_dump_portguid(FILE * out, int detail)
> +{
> +	fprintf(out,
> +		"dump_portguid [file filename] regexp1 [regexp2 [regexp3 ...]] -- Dump port GUID matching a regexp \n");
> +	if (detail) {
> +		fprintf(out,
> +			"getguidgetguid  -- Dump all the port GUID whom node_desc matches one of the provided regexp\n");
> +		fprintf(out,
> +			"   [file filename] -- Send the port GUID list to the specified file instead of regular output\n");
> +	}
> +
> +}
>  
>  static const struct command console_cmds[] = {
>  	{"help", &help_command, &help_parse},
> @@ -1192,6 +1296,7 @@ static const struct command console_cmds[] = {
>  #ifdef ENABLE_OSM_PERF_MGR
>  	{"perfmgr", &help_perfmgr, &perfmgr_parse},
>  #endif				/* ENABLE_OSM_PERF_MGR */
> +	{"dump_portguid", &help_dump_portguid, &dump_portguid_parse},
>  	{NULL, NULL, NULL}	/* end of array */
>  };
>  
> 




More information about the general mailing list