public inbox for linux-rdma@vger.kernel.org
 help / color / mirror / Atom feed
From: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
To: Sasha Khapyorsky <sashak-smomgflXvOZWk0Htik3J/w@public.gmane.org>
Cc: Hal Rosenstock
	<hal.rosenstock-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	"linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH] opensm: add force_link_speed_file config option.
Date: Thu, 15 Oct 2009 13:31:24 -0700	[thread overview]
Message-ID: <20091015133124.2295ac40.weiny2@llnl.gov> (raw)
In-Reply-To: <20091015132650.6e8b8dde.weiny2-i2BcT+NCU+M@public.gmane.org>

Sasha,

Hal caught that I am not freeing the force_link_speed_except_guids on shutdown.  V2 coming shortly.

Ira

On Thu, 15 Oct 2009 13:26:50 -0700
Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org> wrote:

> 
> From: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
> Date: Wed, 14 Oct 2009 16:09:25 -0700
> Subject: [PATCH] opensm: add force_link_speed_file config option.
> 
> 	From the config file help:
> 
> 	# Optional file used to override individual port GUIDs and speeds to be forced.
> 	# Port GUIDs which are _not_ listed in this file will be set to "force_link_speed"
> 	# Speeds specified in this file may be higher or lower than the global
> 	# setting (force_link_speed) above
> 	# File Format:
> 	# # comment
> 	# <port_guid> [<setting>] [# comment]
> 	# ...
> 	# if the optional <setting> is not specified the default (15) will be used
> 
> This option along with the force_link_speed option can be used to override the
> PortInfo:LinkSpeedSupported option for hardware which is not operating
> properly.  Previously one could only force a singe speed across a fabric.  With
> this option one can set speeds on an individual node basis.
> 
> Signed-off-by: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
> ---
>  opensm/include/opensm/osm_base.h   |   10 ++++
>  opensm/include/opensm/osm_sm.h     |    1 +
>  opensm/include/opensm/osm_subnet.h |    6 ++
>  opensm/opensm/osm_link_mgr.c       |   22 +++++++-
>  opensm/opensm/osm_sm.c             |    2 +
>  opensm/opensm/osm_subnet.c         |   99 +++++++++++++++++++++++++++++++++++-
>  6 files changed, 135 insertions(+), 5 deletions(-)
> 
> diff --git a/opensm/include/opensm/osm_base.h b/opensm/include/opensm/osm_base.h
> index 06223ce..5457bc6 100644
> --- a/opensm/include/opensm/osm_base.h
> +++ b/opensm/include/opensm/osm_base.h
> @@ -146,6 +146,16 @@ BEGIN_C_DECLS
>  * SYNOPSIS
>  */
>  #define OSM_DEFAULT_MAX_OP_VLS 5
> +/****s* OpenSM: Base/OSM_DEFAULT_FORCE_LINK_SPEED
> +* NAME
> +*	OSM_DEFAULT_FORCE_LINK_SPEED
> +*
> +* DESCRIPTION
> +*	Default force link speed value
> +*
> +* SYNOPSIS
> +*/
> +#define OSM_DEFAULT_FORCE_LINK_SPEED 15
>  /********/
>  /****s* OpenSM: Base/OSM_DEFAULT_SL
>  * NAME
> diff --git a/opensm/include/opensm/osm_sm.h b/opensm/include/opensm/osm_sm.h
> index e653d49..7086ca6 100644
> --- a/opensm/include/opensm/osm_sm.h
> +++ b/opensm/include/opensm/osm_sm.h
> @@ -143,6 +143,7 @@ typedef struct osm_sm {
>  	cl_disp_reg_handle_t slvl_disp_h;
>  	cl_disp_reg_handle_t vla_disp_h;
>  	cl_disp_reg_handle_t pkey_disp_h;
> +	cl_map_t force_link_speed_except_guids;
>  } osm_sm_t;
>  /*
>  * FIELDS
> diff --git a/opensm/include/opensm/osm_subnet.h b/opensm/include/opensm/osm_subnet.h
> index 9488225..5353298 100644
> --- a/opensm/include/opensm/osm_subnet.h
> +++ b/opensm/include/opensm/osm_subnet.h
> @@ -154,6 +154,7 @@ typedef struct osm_subn_opt {
>  	boolean_t lmc_esp0;
>  	uint8_t max_op_vls;
>  	uint8_t force_link_speed;
> +	char *force_link_speed_file;
>  	boolean_t reassign_lids;
>  	boolean_t ignore_other_sm;
>  	boolean_t single_thread;
> @@ -469,6 +470,11 @@ typedef struct osm_subn_opt {
>  *	Subnet object
>  *********/
>  
> +typedef struct force_speed_exception {
> +	uint64_t port_guid;
> +	uint8_t val;
> +} force_speed_exception_t;
> +
>  /****s* OpenSM: Subnet/osm_subn_t
>  * NAME
>  *	osm_subn_t
> diff --git a/opensm/opensm/osm_link_mgr.c b/opensm/opensm/osm_link_mgr.c
> index c9bdfee..21dcc50 100644
> --- a/opensm/opensm/osm_link_mgr.c
> +++ b/opensm/opensm/osm_link_mgr.c
> @@ -106,6 +106,8 @@ static int link_mgr_set_physp_pi(osm_sm_t * sm, IN osm_physp_t * p_physp,
>  	boolean_t esp0 = FALSE, send_set = FALSE;
>  	osm_physp_t *p_remote_physp;
>  	int ret = 0;
> +	uint8_t force_link_speed;
> +	force_speed_exception_t *except;
>  
>  	OSM_LOG_ENTER(sm->p_log);
>  
> @@ -326,12 +328,26 @@ static int link_mgr_set_physp_pi(osm_sm_t * sm, IN osm_physp_t * p_physp,
>  			   sizeof(p_pi->link_width_enabled)))
>  			send_set = TRUE;
>  
> -		if (sm->p_subn->opt.force_link_speed &&
> -		    (sm->p_subn->opt.force_link_speed != 15 ||
> +		/* use the force link speed set in the config */
> +		force_link_speed = sm->p_subn->opt.force_link_speed;
> +		/* unless this port guid is in our "except"ion file */
> +		if ((except = cl_map_get(
> +				&sm->force_link_speed_except_guids,
> +				cl_ntoh64(p_physp->port_guid)))
> +					!= NULL) {
> +			force_link_speed = except->val;
> +			OSM_LOG(sm->p_log, OSM_LOG_DEBUG,
> +				"Skipping force_link_speed on GUID 0x%016"
> +				PRIx64 " (%d)\n",
> +			       cl_ntoh64(p_physp->port_guid),
> +			       force_link_speed);
> +		}
> +
> +		if (force_link_speed &&
> +		     (force_link_speed != OSM_DEFAULT_FORCE_LINK_SPEED ||
>  		     ib_port_info_get_link_speed_enabled(p_pi) !=
>  		     ib_port_info_get_link_speed_sup(p_pi))) {
>  			ib_port_info_set_link_speed_enabled(p_pi,
> -							    sm->p_subn->opt.
>  							    force_link_speed);
>  			if (memcmp(&p_pi->link_speed, &p_old_pi->link_speed,
>  				   sizeof(p_pi->link_speed)))
> diff --git a/opensm/opensm/osm_sm.c b/opensm/opensm/osm_sm.c
> index f780124..e5cf2b4 100644
> --- a/opensm/opensm/osm_sm.c
> +++ b/opensm/opensm/osm_sm.c
> @@ -168,6 +168,8 @@ void osm_sm_construct(IN osm_sm_t * p_sm)
>  	osm_sm_mad_ctrl_construct(&p_sm->mad_ctrl);
>  	osm_lid_mgr_construct(&p_sm->lid_mgr);
>  	osm_ucast_mgr_construct(&p_sm->ucast_mgr);
> +	cl_map_construct(&p_sm->force_link_speed_except_guids);
> +	cl_map_init(&p_sm->force_link_speed_except_guids, 10);
>  }
>  
>  /**********************************************************************
> diff --git a/opensm/opensm/osm_subnet.c b/opensm/opensm/osm_subnet.c
> index 647950e..6aa338f 100644
> --- a/opensm/opensm/osm_subnet.c
> +++ b/opensm/opensm/osm_subnet.c
> @@ -46,6 +46,7 @@
>  #  include <config.h>
>  #endif				/* HAVE_CONFIG_H */
>  
> +#include <sys/stat.h>
>  #include <string.h>
>  #include <stdio.h>
>  #include <stdarg.h>
> @@ -305,6 +306,7 @@ static const opt_rec_t opt_tbl[] = {
>  	{ "lmc_esp0", OPT_OFFSET(lmc_esp0), opts_parse_boolean, NULL, 1 },
>  	{ "max_op_vls", OPT_OFFSET(max_op_vls), opts_parse_uint8, NULL, 1 },
>  	{ "force_link_speed", OPT_OFFSET(force_link_speed), opts_parse_uint8, NULL, 1 },
> +	{ "force_link_speed_file", OPT_OFFSET(force_link_speed_file), opts_parse_charp, NULL, 1 },
>  	{ "reassign_lids", OPT_OFFSET(reassign_lids), opts_parse_boolean, NULL, 1 },
>  	{ "ignore_other_sm", OPT_OFFSET(ignore_other_sm), opts_parse_boolean, NULL, 1 },
>  	{ "single_thread", OPT_OFFSET(single_thread), opts_parse_boolean, NULL, 0 },
> @@ -700,7 +702,8 @@ void osm_subn_set_default_opt(IN osm_subn_opt_t * p_opt)
>  	p_opt->lmc = OSM_DEFAULT_LMC;
>  	p_opt->lmc_esp0 = FALSE;
>  	p_opt->max_op_vls = OSM_DEFAULT_MAX_OP_VLS;
> -	p_opt->force_link_speed = 15;
> +	p_opt->force_link_speed = OSM_DEFAULT_FORCE_LINK_SPEED;
> +	p_opt->force_link_speed_file = NULL;
>  	p_opt->reassign_lids = FALSE;
>  	p_opt->ignore_other_sm = FALSE;
>  	p_opt->single_thread = FALSE;
> @@ -927,6 +930,73 @@ static ib_api_status_t osm_parse_prefix_routes_file(IN osm_subn_t * p_subn)
>  
>  /**********************************************************************
>   **********************************************************************/
> +void osm_parse_force_link_speed_except_file(IN osm_opensm_t * const p_osm,
> +					    IN char *file)
> +{
> +	FILE *fp;
> +	char line[1024];
> +	uint64_t guid = 0;
> +	force_speed_exception_t *except = NULL;
> +	cl_map_t *map = &p_osm->sm.force_link_speed_except_guids;
> +	cl_map_iterator_t head;
> +
> +	CL_ASSERT(cl_is_map_inited(map));
> +
> +	/* clear previous entries */
> +	head = cl_map_head(map);
> +	while (head != cl_map_end(map)) {
> +		except = (force_speed_exception_t *)cl_map_obj(head);
> +		cl_map_remove_item(map, head);
> +		free(except);
> +		head = cl_map_head(map);
> +	}
> +
> +	if (file) {
> +		fp = fopen(file, "r");
> +		if (!fp) {
> +			osm_log(&p_osm->log, OSM_LOG_ERROR,
> +				"failed to open force_link_speed_file "
> +				"\'%s\'\n",
> +				file);
> +			return;
> +		}
> +
> +		while (fgets(line, sizeof(line) - 1, fp) != NULL) {
> +			char *p;
> +			char *guid_str, *force_str;
> +			unsigned long force_val;
> +
> +			p = strchr(line, '#');
> +			if (p)
> +				*p = '\0';
> +
> +			guid_str = strtok_r(line, " \t\n", &p);
> +			if (guid_str &&
> +			   ((guid = strtoull(guid_str, NULL, 0)) != 0)) {
> +				except = calloc(1, sizeof *except);
> +
> +				force_str = strtok_r(NULL, " \t\n", &p);
> +				if (force_str) {
> +					force_val = strtoul(force_str, NULL, 0);
> +				} else
> +					force_val = OSM_DEFAULT_FORCE_LINK_SPEED;
> +
> +				except->port_guid = guid;
> +				except->val = (uint8_t)force_val;
> +				OSM_LOG(&p_osm->log, OSM_LOG_DEBUG,
> +					"Setting exception to "
> +					"force_link_speed on GUID 0x%016"
> +					PRIx64 " (%d)\n", except->port_guid, except->val);
> +				cl_map_insert(map, guid, (void *)except);
> +			}
> +		}
> +
> +		fclose(fp);
> +	}
> +}
> +
> +/**********************************************************************
> + **********************************************************************/
>  static void subn_verify_max_vls(unsigned *max_vls, const char *prefix, unsigned dflt)
>  {
>  	if (!*max_vls || *max_vls > 15) {
> @@ -1097,6 +1167,15 @@ int osm_subn_verify_config(IN osm_subn_opt_t * p_opts)
>  		p_opts->max_wire_smps = OSM_DEFAULT_SMP_MAX_ON_WIRE;
>  	}
>  
> +	if (p_opts->force_link_speed_file) {
> +		struct stat statbuf;
> +		if (stat(p_opts->force_link_speed_file, &statbuf))
> +			log_report(" Invalid Cached Option "
> +				   "Value:force_link_speed_file = %s"
> +				   "; file not found\n",
> +				   p_opts->force_link_speed_file);
> +	}
> +
>  	if (strcmp(p_opts->console, OSM_DISABLE_CONSOLE)
>  	    && strcmp(p_opts->console, OSM_LOCAL_CONSOLE)
>  #ifdef ENABLE_OSM_CONSOLE_SOCKET
> @@ -1265,6 +1344,9 @@ int osm_subn_rescan_conf_files(IN osm_subn_t * p_subn)
>  
>  	osm_parse_prefix_routes_file(p_subn);
>  
> +	osm_parse_force_link_speed_except_file(p_subn->p_osm,
> +					       p_opts->force_link_speed_file);
> +
>  	return 0;
>  }
>  
> @@ -1331,8 +1413,18 @@ int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * p_opts)
>  		"#    5: 2.5 or 10.0 Gbps\n"
>  		"#    7: 2.5 or 5.0 or 10.0 Gbps\n"
>  		"#    2,4,6,8-14 Reserved\n"
> -		"#    Default 15: set to PortInfo:LinkSpeedSupported\n"
> +		"#    Default %d: set to PortInfo:LinkSpeedSupported\n"
>  		"force_link_speed %u\n\n"
> +		"# Optional file used to override individual port GUIDs and speeds to be forced.\n"
> +		"# Port GUIDs which are _not_ listed in this file will be set to \"force_link_speed\"\n"
> +		"# Speeds specified in this file may be higher or lower than the global setting\n"
> +		"# (force_link_speed) above\n"
> +		"# File Format:\n"
> +		"# # comment\n"
> +		"# <port_guid> [<setting>] [# comment]\n"
> +		"# ...\n"
> +		"# if the optional <setting> is not specified the default (%d) will be used\n"
> +		"force_link_speed_file %s\n\n"
>  		"# The subnet_timeout code that will be set for all the ports\n"
>  		"# The actual timeout is 4.096usec * 2^<subnet_timeout>\n"
>  		"subnet_timeout %u\n\n"
> @@ -1355,7 +1447,10 @@ int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * p_opts)
>  		p_opts->head_of_queue_lifetime,
>  		p_opts->leaf_head_of_queue_lifetime,
>  		p_opts->max_op_vls,
> +		OSM_DEFAULT_FORCE_LINK_SPEED,
>  		p_opts->force_link_speed,
> +		OSM_DEFAULT_FORCE_LINK_SPEED,
> +		p_opts->force_link_speed_file,
>  		p_opts->subnet_timeout,
>  		p_opts->local_phy_errors_threshold,
>  		p_opts->overrun_errors_threshold);
> -- 
> 1.5.4.5
> 


-- 
Ira Weiny
Math Programmer/Computer Scientist
Lawrence Livermore National Lab
925-423-8008
weiny2-i2BcT+NCU+M@public.gmane.org
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2009-10-15 20:31 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-15 20:26 [PATCH] opensm: add force_link_speed_file config option Ira Weiny
     [not found] ` <20091015132650.6e8b8dde.weiny2-i2BcT+NCU+M@public.gmane.org>
2009-10-15 20:31   ` Ira Weiny [this message]
2009-10-15 21:26   ` Sasha Khapyorsky
2009-10-16  0:04     ` Ira Weiny
     [not found]       ` <20091015170428.4e75735f.weiny2-i2BcT+NCU+M@public.gmane.org>
2009-10-16  0:23         ` Dave Olson
2009-10-16 16:47         ` Sasha Khapyorsky

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091015133124.2295ac40.weiny2@llnl.gov \
    --to=weiny2-i2bct+ncu+m@public.gmane.org \
    --cc=hal.rosenstock-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=sashak-smomgflXvOZWk0Htik3J/w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox