[openib-general] [PATCH 1/3] opensm: low-level QoS configuration

Sasha Khapyorsky sashak at voltaire.com
Tue May 9 11:15:48 PDT 2006


Trivial low-level QoS configuration parameters description, definition
and processing.

Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
---

 osm/doc/qos-config.txt          |   44 +++++++++++++
 osm/include/opensm/osm_subnet.h |   81 ++++++++++++++++++++++++
 osm/opensm/osm_subnet.c         |  133 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 258 insertions(+), 0 deletions(-)

diff --git a/osm/doc/qos-config.txt b/osm/doc/qos-config.txt
new file mode 100644
index 0000000..2f9373c
--- /dev/null
+++ b/osm/doc/qos-config.txt
@@ -0,0 +1,44 @@
+Trivial low level QoS configuration proposition.
+===============================================
+
+Basically we have set of QoS related low-level configuration parameters.
+All those parameter names are prefixed by "qos_" string. There is full
+list of such parameters:
+
+  qos_max_vls    - The number of maximum VLs will be on the Subnet
+  qos_high_limit - The limit of High Priority component of VL Arbitration
+                   table (IBA 7.6.9)
+  qos_vlarb_low  - High priority VL Arbitration table (IBA 7.6.9) template.
+  qos_vlarb_high - Low priority VL Arbitration table (IBA 7.6.9) template.
+                   Both VL arbitration templates are pairs of VL and weight.
+  qos_sl2vl      - SL2VL Mapping table (IBA 7.6.6) template. It is a list
+                   of VLs corresponding to SLs 0-15. (Note the VL15 used
+                   here means drop this SL).
+
+Typical default values (hard-coded in OpenSM initialization) are:
+
+  qos_max_vls=15
+  qos_high_limit=0
+  qos_vlarb_low=0:0,1:4,2:4,3:4,4:4,5:4,6:4,7:4,8:4,9:4,10:4,11:4,12:4,13:4,14:4
+  qos_vlarb_high=0:4,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0
+  qos_sl2vl=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7
+
+The syntax is compatible with rest of OpenSM configuration options and
+values may be stored in OpenSM config file (cached options file).
+
+In addition to above we may to define separate QoS configuration
+parameters sets for various target types. As targets we currently support
+HCA, routers, switch external ports and switch's enhanced port 0. The
+names of such specialized parameters are prefixed by "qos_<type>_"
+string. There is full list of currently supported sets:
+
+  qos_hca_ - QoS configuration parameters set for HCAs.
+  qos_rtr_ - parameters set for routers.
+  qos_sw0_ - parameters set for switches' port 0.
+  qos_swe_ - parameters set for switches' external ports.
+
+Examples:
+
+  qos_sw0_max_vls=2
+  qos_hca_sl2vl=0,1,2,3,5,5,5,12,12,0,
+  qos_swe_high_limit=0
diff --git a/osm/include/opensm/osm_subnet.h b/osm/include/opensm/osm_subnet.h
index 767e598..0da3f0c 100644
--- a/osm/include/opensm/osm_subnet.h
+++ b/osm/include/opensm/osm_subnet.h
@@ -180,6 +180,44 @@ typedef enum _osm_testability_modes
 } osm_testability_modes_t;
 /***********/
 
+/****s* OpenSM: Subnet/osm_qos_options_t
+* NAME
+*	osm_qos_options_t
+*
+* DESCRIPTION
+*	Subnet QoS options structure.  This structure contains the various
+*	QoS specific configuration parameters for the subnet.
+*
+* SYNOPSIS
+*/
+typedef struct _osm_qos_options_t {
+  unsigned max_vls;
+  unsigned high_limit;
+  char *vlarb_high;
+  char *vlarb_low;
+  char *sl2vl;
+} osm_qos_options_t;
+/*
+* FIELDS
+*
+*	max_vls
+*		The number of maximum VLs on the Subnet
+*
+*	high_limit
+*		The limit of High Priority component of VL Arbitration
+*		table (IBA 7.6.9)
+*
+*	vlarb_high
+*		High priority VL Arbitration table template.
+*
+*	vlarb_low
+*		Low priority VL Arbitration table template.
+*
+*	sl2vl
+*		SL2VL Mapping table (IBA 7.6.6) template.
+*
+*********/
+
 /****s* OpenSM: Subnet/osm_subn_opt_t
 * NAME
 *	osm_subn_opt_t
@@ -242,6 +280,10 @@ typedef struct _osm_subn_opt
   char *                   updn_guid_file;
   boolean_t                exit_on_fatal;
   boolean_t                honor_guid2lid_file;
+  osm_qos_options_t        qos_options;
+  osm_qos_options_t        qos_hca_options;
+  osm_qos_options_t        qos_sw0_options;
+  osm_qos_options_t        qos_swe_options;
 } osm_subn_opt_t;
 /*
 * FIELDS
@@ -394,6 +436,18 @@ typedef struct _osm_subn_opt
 *     the file will be honored when SM is coming out of STANDBY. 
 *     By default this is FALSE.
 *
+*  qos_options
+*     Default set of QoS options
+*
+*  qos_hca_options
+*     QoS options for HCA ports
+*
+*  qos_sw0_options
+*     QoS options for switches' port 0
+*
+*  qos_swe_options
+*     QoS options for switches' external ports
+*
 * SEE ALSO
 *	Subnet object
 *********/
@@ -1016,6 +1070,33 @@ osm_subn_parse_conf_file(
 *	osm_subn_is_inited
 *********/
 
+/****f* OpenSM: Subnet/osm_subn_parse_conf_file
+* NAME
+*	osm_subn_rescan_conf_file
+*
+* DESCRIPTION
+*	The osm_subn_rescan_conf_file function parses the configuration
+*	file and update selected subnet options
+*
+* SYNOPSIS
+*/
+void
+osm_subn_rescan_conf_file(
+  IN osm_subn_opt_t* const p_opts );
+/*
+* PARAMETERS
+*
+*	p_opt
+*		[in] Pointer to the subnet options structure.
+*
+* RETURN VALUES
+*	None
+*
+* NOTES
+*  This uses the same file as osm_subn_parse_conf_file()
+*
+*********/
+
 /****f* OpenSM: Subnet/osm_subn_write_conf_file
 * NAME
 *	osm_subn_write_conf_file
diff --git a/osm/opensm/osm_subnet.c b/osm/opensm/osm_subnet.c
index ef64e05..4580ed1 100644
--- a/osm/opensm/osm_subnet.c
+++ b/osm/opensm/osm_subnet.c
@@ -398,6 +398,19 @@ osm_get_port_by_guid(
 
 /**********************************************************************
  **********************************************************************/
+static void
+subn_set_default_qos_options(
+  IN osm_qos_options_t *opt)
+{
+  opt->max_vls = 15;
+  opt->high_limit = 0;
+  opt->vlarb_high = "0:4,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0";
+  opt->vlarb_low = "0:0,1:4,2:4,3:4,4:4,5:4,6:4,7:4,8:4,9:4,10:4,11:4,12:4,13:4,14:4";
+  opt->sl2vl = "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7";
+}
+
+/**********************************************************************
+ **********************************************************************/
 void
 osm_subn_set_default_opt(
   IN osm_subn_opt_t* const p_opt )
@@ -457,6 +470,10 @@ osm_subn_set_default_opt(
   p_opt->updn_activate = FALSE;
   p_opt->updn_guid_file = NULL;
   p_opt->exit_on_fatal = TRUE;
+  subn_set_default_qos_options(&p_opt->qos_options);
+  subn_set_default_qos_options(&p_opt->qos_hca_options);
+  subn_set_default_qos_options(&p_opt->qos_sw0_options);
+  subn_set_default_qos_options(&p_opt->qos_swe_options);
 }
 
 /**********************************************************************
@@ -619,6 +636,95 @@ __osm_subn_opts_unpack_charp(
 
 /**********************************************************************
  **********************************************************************/
+static void
+subn_parse_qos_options(
+  IN const char *prefix,
+  IN char *p_key,
+  IN char *p_val_str,
+  IN osm_qos_options_t *opt)
+{
+  char name[256];
+  snprintf(name, sizeof(name), "%s_max_vls", prefix);
+  __osm_subn_opts_unpack_uint32(name, p_key, p_val_str, &opt->max_vls);
+  snprintf(name, sizeof(name), "%s_high_limit", prefix);
+  __osm_subn_opts_unpack_uint32(name, p_key, p_val_str, &opt->high_limit);
+  snprintf(name, sizeof(name), "%s_vlarb_high", prefix);
+  __osm_subn_opts_unpack_charp(name, p_key, p_val_str, &opt->vlarb_high);
+  snprintf(name, sizeof(name), "%s_vlarb_low", prefix);
+  __osm_subn_opts_unpack_charp(name, p_key, p_val_str, &opt->vlarb_low);
+  snprintf(name, sizeof(name), "%s_sl2vl", prefix);
+  __osm_subn_opts_unpack_charp(name, p_key, p_val_str, &opt->sl2vl);
+}
+
+static int
+subn_dump_qos_options(
+  FILE *file,
+  const char *set_name,
+  const char *prefix,
+  osm_qos_options_t *opt)
+{
+	return fprintf(file, "# %s\n"
+		"%s_max_vls %u\n"
+		"%s_high_limit %u\n"
+		"%s_vlarb_high %s\n"
+		"%s_vlarb_low %s\n"
+		"%s_sl2vl %s\n",
+		set_name,
+		prefix, opt->max_vls,
+		prefix, opt->high_limit,
+		prefix, opt->vlarb_high,
+		prefix, opt->vlarb_low,
+		prefix, opt->sl2vl);
+}
+
+/**********************************************************************
+ **********************************************************************/
+void
+osm_subn_rescan_conf_file(
+  IN osm_subn_opt_t* const p_opts )
+{
+  char *p_cache_dir = getenv("OSM_CACHE_DIR");
+  char file_name[256];
+  FILE *opts_file;
+  char line[1024];
+  char *p_key, *p_val ,*p_last;
+  
+  /* try to open the options file from the cache dir */
+  if (! p_cache_dir) p_cache_dir = OSM_DEFAULT_CACHE_DIR;
+
+  strcpy(file_name, p_cache_dir);
+  strcat(file_name,"opensm.opts");
+  
+  opts_file = fopen(file_name, "r");
+  if (!opts_file) return;
+
+  while (fgets(line, 1023, opts_file) != NULL)
+  {
+    /* get the first token */
+    p_key = strtok_r(line, " \t\n", &p_last);
+    if (p_key)
+    {
+      p_val = strtok_r(NULL, " \t\n", &p_last);
+
+      subn_parse_qos_options("qos",
+        p_key, p_val, &p_opts->qos_options);
+
+      subn_parse_qos_options("qos_hca",
+        p_key, p_val, &p_opts->qos_hca_options);
+
+      subn_parse_qos_options("qos_sw0",
+        p_key, p_val, &p_opts->qos_sw0_options);
+
+      subn_parse_qos_options("qos_swe",
+        p_key, p_val, &p_opts->qos_swe_options);
+
+    }
+  }
+  fclose(opts_file);
+}
+
+/**********************************************************************
+ **********************************************************************/
 void
 osm_subn_parse_conf_file(
   IN osm_subn_opt_t* const p_opts )
@@ -802,6 +908,18 @@ osm_subn_parse_conf_file(
         "honor_guid2lid_file",
         p_key, p_val, &p_opts->honor_guid2lid_file);
 
+      subn_parse_qos_options("qos",
+        p_key, p_val, &p_opts->qos_options);
+
+      subn_parse_qos_options("qos_hca",
+        p_key, p_val, &p_opts->qos_hca_options);
+
+      subn_parse_qos_options("qos_sw0",
+        p_key, p_val, &p_opts->qos_sw0_options);
+
+      subn_parse_qos_options("qos_swe",
+        p_key, p_val, &p_opts->qos_swe_options);
+
     }
   }
   fclose(opts_file);
@@ -997,6 +1115,21 @@ osm_subn_write_conf_file(
     p_opts->exit_on_fatal ? "TRUE" : "FALSE"
     );
   
+  fprintf(
+    opts_file,
+    "#\n# QoS OPTIONS\n#\n\n");
+  subn_dump_qos_options(opts_file,
+    "QoS default options", "qos", &p_opts->qos_options);
+  fprintf(opts_file, "\n");
+  subn_dump_qos_options(opts_file,
+    "QoS HCA options", "qos_hca", &p_opts->qos_hca_options);
+  fprintf(opts_file, "\n");
+  subn_dump_qos_options(opts_file,
+    "QoS Switch Port 0 options", "qos_sw0", &p_opts->qos_sw0_options);
+  fprintf(opts_file, "\n");
+  subn_dump_qos_options(opts_file,
+    "QoS Switch external ports options", "qos_swe", &p_opts->qos_swe_options);
+
   /* optional string attributes ... */
   
   fclose(opts_file);



More information about the general mailing list