From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hal Rosenstock Subject: Re: [PATCHv3] opensm: Add support for partition enforcement types Date: Mon, 25 Jul 2011 14:14:36 -0400 Message-ID: <4E2DB28C.7030500@dev.mellanox.co.il> References: <4E135D51.3080208@dev.mellanox.co.il> <20110710112626.GC8520@localhost.localdomain> <4E1AE7D6.9060209@dev.mellanox.co.il> <20110713140942.GC17818@localhost.localdomain> <4E1E2C0B.6060106@dev.mellanox.co.il> <20110724144255.GC17166@calypso.voltaire.com> <20110725162755.GE17166@calypso.voltaire.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20110725162755.GE17166-iQai9MGU/dyyaiaB+Ve85laTQe2KTcn/@public.gmane.org> Sender: linux-rdma-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Alex Netes Cc: "linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" List-Id: linux-rdma@vger.kernel.org On 7/25/2011 12:27 PM, Alex Netes wrote: > This should be the correct patch. Sorry for the mess. Looks good to me; just a couple of nits below... > Partition enforcement types are in, out, and both. in, out, both and off. > Prior to this support, both was being used so that is the default. > > Signed-off-by: Alex Netes > --- > Changes since v2: Added comments in man, conf file and help > --- > > include/opensm/osm_subnet.h | 15 +++++++++++++++ > man/opensm.8.in | 14 +++++++++++--- > opensm/main.c | 32 +++++++++++++++++++++++++++++--- > opensm/osm_pkey_mgr.c | 40 ++++++++++++++++++++++++---------------- > opensm/osm_subnet.c | 34 ++++++++++++++++++++++++++++++++-- > 5 files changed, 111 insertions(+), 24 deletions(-) > > diff --git a/include/opensm/osm_subnet.h b/include/opensm/osm_subnet.h > index 6d17c31..99f7f5e 100644 > --- a/include/opensm/osm_subnet.h > +++ b/include/opensm/osm_subnet.h > @@ -68,6 +68,19 @@ BEGIN_C_DECLS > #define OSM_SUBNET_VECTOR_MIN_SIZE 0 > #define OSM_SUBNET_VECTOR_GROW_SIZE 1 > #define OSM_SUBNET_VECTOR_CAPACITY 256 > + > +#define OSM_PARTITION_ENFORCE_BOTH "both" > +#define OSM_PARTITION_ENFORCE_IN "in" > +#define OSM_PARTITION_ENFORCE_OUT "out" > +#define OSM_PARTITION_ENFORCE_OFF "off" > + > +typedef enum _osm_partition_enforce_type_enum { > + OSM_PARTITION_ENFORCE_TYPE_BOTH, > + OSM_PARTITION_ENFORCE_TYPE_IN, > + OSM_PARTITION_ENFORCE_TYPE_OUT, > + OSM_PARTITION_ENFORCE_TYPE_OFF > +} osm_partition_enforce_type_enum; > + > struct osm_opensm; > struct osm_qos_policy; > > @@ -182,6 +195,8 @@ typedef struct osm_subn_opt { > unsigned long log_max_size; > char *partition_config_file; > boolean_t no_partition_enforcement; > + char *part_enforce; > + osm_partition_enforce_type_enum part_enforce_enum; > boolean_t qos; > char *qos_policy_file; > boolean_t accum_log_file; > diff --git a/man/opensm.8.in b/man/opensm.8.in > index f360739..ea7bdd2 100644 > --- a/man/opensm.8.in > +++ b/man/opensm.8.in > @@ -1,4 +1,4 @@ > -.TH OPENSM 8 "November 3, 2010" "OpenIB" "OpenIB Management" > +.TH OPENSM 8 "July 5, 2011" "OpenIB" "OpenIB Management" > > .SH NAME > opensm \- InfiniBand subnet manager and administration (SM/SA) > @@ -44,7 +44,8 @@ opensm \- InfiniBand subnet manager and administration (SM/SA) > [\-f | \-\-log_file ] > [\-L | \-\-log_limit ] [\-e(rase_log_file)] > [\-P(config) ] > -[\-N | \-\-no_part_enforce] > +[\-N | \-\-no_part_enforce] (DEPRECATED) > +[\-Z | \-\-part_enforce [both | in | out | off]] > [\-Q | \-\-qos [\-Y | \-\-qos_policy_file ]] > [\-y | \-\-stay_on_fatal] > [\-B | \-\-daemon] > @@ -363,9 +364,16 @@ name is \fB\%@OPENSM_CONFIG_DIR@/@QOS_POLICY_FILE@\fP. See > QoS_management_in_OpenSM.txt in opensm doc for more information on > configuring QoS policy via this file. > .TP > -\fB\-N\fR, \fB\-\-no_part_enforce\fR > +\fB\-N\fR, \fB\-\-no_part_enforce\fR \fB(DEPRECATED)\fR > +This is a deprecated flag. Please use \fB\-\-part_enforce\fR instead. > This option disables partition enforcement on switch external ports. > .TP > +\fB\-Z\fR, \fB\-\-part_enforce\fR [both | in | out | off] > +This option indicates the partition enforcement type (for switches). > +Enforcement type can be inbound only (in), outbound only (out), > +both or disabled (off). Default is both. When \fB\-\-no_part_enforce\fR > +is TRUE, partition enforcement is off. > +.TP > \fB\-y\fR, \fB\-\-stay_on_fatal\fR > This option will cause SM not to exit on fatal initialization > issues: if SM discovers duplicated guids or a 12x link with > diff --git a/opensm/main.c b/opensm/main.c > index 798cb20..d0aaa1f 100644 > --- a/opensm/main.c > +++ b/opensm/main.c > @@ -1,6 +1,6 @@ > /* > * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. > - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. > + * Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved. > * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. > * Copyright (c) 2009 HNR Consulting. All rights reserved. > * Copyright (c) 2009 System Fabric Works, Inc. All rights reserved. > @@ -318,8 +318,14 @@ static void show_usage(void) > " This option defines the optional partition configuration file.\n" > " The default name is \'" > OSM_DEFAULT_PARTITION_CONFIG_FILE "\'.\n\n"); > - printf("--no_part_enforce, -N\n" > + printf("--no_part_enforce, -N (DEPRECATED)\n" > + " Use --part_enforce instead.\n" > " This option disables partition enforcement on switch external ports.\n\n"); > + printf("--part_enforce, -Z [both, in, out, off]\n" > + " This option indicates the partition enforcement type (for switches)\n" > + " Enforcement type can be outbound only (out), inbound only (in), both or\n" > + " disabled (off). Default is both. When --no_part_enforce is TRUE, partition\n" > + " is off\n\n"); enforcement is off -- Hal > printf("--qos, -Q\n" " This option enables QoS setup.\n\n"); > printf("--qos_policy_file, -Y \n" > " This option defines the optional QoS policy file.\n" > @@ -566,7 +572,7 @@ int main(int argc, char *argv[]) > char *conf_template = NULL, *config_file = NULL; > uint32_t val; > const char *const short_option = > - "F:c:i:w:O:f:ed:D:g:l:L:s:t:a:u:m:X:R:zM:U:S:P:Y:ANBIQvVhoryxp:n:q:k:C:G:H:"; > + "F:c:i:w:O:f:ed:D:g:l:L:s:t:a:u:m:X:R:zM:U:S:P:Y:ANBIQvVhoryxp:n:q:k:C:G:H:Z:"; > > /* > In the array below, the 2nd parameter specifies the number > @@ -595,6 +601,7 @@ int main(int argc, char *argv[]) > {"erase_log_file", 0, NULL, 'e'}, > {"Pconfig", 1, NULL, 'P'}, > {"no_part_enforce", 0, NULL, 'N'}, > + {"part_enforce", 1, NULL, 'Z'}, > {"qos", 0, NULL, 'Q'}, > {"qos_policy_file", 1, NULL, 'Y'}, > {"maxsmps", 1, NULL, 'n'}, > @@ -870,6 +877,25 @@ int main(int argc, char *argv[]) > opt.no_partition_enforcement = TRUE; > break; > > + case 'Z': > + if (strcmp(optarg, OSM_PARTITION_ENFORCE_BOTH) == 0 > + || strcmp(optarg, OSM_PARTITION_ENFORCE_IN) == 0 > + || strcmp(optarg, OSM_PARTITION_ENFORCE_OUT) == 0 > + || strcmp(optarg, OSM_PARTITION_ENFORCE_OFF) == 0) { > + SET_STR_OPT(opt.part_enforce, optarg); > + if (strcmp(optarg, OSM_PARTITION_ENFORCE_BOTH) == 0) > + opt.part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_BOTH; > + else if (strcmp(optarg, OSM_PARTITION_ENFORCE_IN) == 0) > + opt.part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_IN; > + else if (strcmp(optarg, OSM_PARTITION_ENFORCE_OUT) == 0) > + opt.part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_OUT; > + else > + opt.part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_OFF; > + } else > + printf("-part_enforce %s option not understood\n", > + optarg); > + break; > + > case 'Q': > opt.qos = TRUE; > break; > diff --git a/opensm/osm_pkey_mgr.c b/opensm/osm_pkey_mgr.c > index e6bf0d1..a98cca9 100644 > --- a/opensm/osm_pkey_mgr.c > +++ b/opensm/osm_pkey_mgr.c > @@ -1,6 +1,6 @@ > /* > * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. > - * Copyright (c) 2002-2010 Mellanox Technologies LTD. All rights reserved. > + * Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved. > * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. > * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. > * > @@ -182,16 +182,26 @@ pkey_mgr_update_pkey_entry(IN osm_sm_t * sm, > > static ib_api_status_t > pkey_mgr_enforce_partition(IN osm_log_t * p_log, osm_sm_t * sm, > - IN osm_physp_t * p_physp, IN const boolean_t enforce) > + IN osm_physp_t * p_physp, > + IN osm_partition_enforce_type_enum enforce_type) > { > osm_madw_context_t context; > uint8_t payload[IB_SMP_DATA_SIZE]; > ib_port_info_t *p_pi; > ib_api_status_t status; > + uint8_t enforce_bits; > > p_pi = &p_physp->port_info; > > - if ((p_pi->vl_enforce & 0xc) == (0xc) * (enforce == TRUE)) { > + if (enforce_type == OSM_PARTITION_ENFORCE_TYPE_BOTH) > + enforce_bits = 0xc; > + else if (enforce_type == OSM_PARTITION_ENFORCE_TYPE_IN) > + enforce_bits = 0x8; > + else > + enforce_bits = 0x4; > + > + if ((p_pi->vl_enforce & 0xc) == enforce_bits * > + (enforce_type != OSM_PARTITION_ENFORCE_TYPE_OFF)) { > OSM_LOG(p_log, OSM_LOG_DEBUG, > "No need to update PortInfo for " > "node 0x%016" PRIx64 " port %u (%s)\n", > @@ -207,10 +217,9 @@ pkey_mgr_enforce_partition(IN osm_log_t * p_log, osm_sm_t * sm, > IB_SMP_DATA_SIZE - sizeof(ib_port_info_t)); > > p_pi = (ib_port_info_t *) payload; > - if (enforce == TRUE) > - p_pi->vl_enforce |= 0xc; > - else > - p_pi->vl_enforce &= ~0xc; > + p_pi->vl_enforce &= ~0xc; > + if (enforce_type != OSM_PARTITION_ENFORCE_TYPE_OFF) > + p_pi->vl_enforce |= enforce_bits; > p_pi->state_info2 = 0; > ib_port_info_set_port_state(p_pi, IB_LINK_NO_CHANGE); > > @@ -436,7 +445,7 @@ static int update_peer_block(osm_log_t * p_log, osm_sm_t * sm, > static int pkey_mgr_update_peer_port(osm_log_t * p_log, osm_sm_t * sm, > const osm_subn_t * p_subn, > const osm_port_t * const p_port, > - boolean_t enforce) > + osm_partition_enforce_type_enum enforce_type) > { > osm_physp_t *p_physp, *peer; > osm_node_t *p_node; > @@ -461,8 +470,8 @@ static int pkey_mgr_update_peer_port(osm_log_t * p_log, osm_sm_t * sm, > if (!p_node->sw || !p_node->sw->switch_info.enforce_cap) > return 0; > > - if (enforce == FALSE) { > - pkey_mgr_enforce_partition(p_log, sm, peer, FALSE); > + if (enforce_type != OSM_PARTITION_ENFORCE_TYPE_OFF) { > + pkey_mgr_enforce_partition(p_log, sm, peer, OSM_PARTITION_ENFORCE_TYPE_OFF); > return ret; > } > > @@ -528,14 +537,14 @@ static int pkey_mgr_update_peer_port(osm_log_t * p_log, osm_sm_t * sm, > cl_ntoh64(osm_node_get_node_guid(p_node)), > osm_physp_get_port_num(peer), > p_node->print_desc); > - enforce = FALSE; > + enforce_type = OSM_PARTITION_ENFORCE_TYPE_OFF; > ret = -1; > } > } > } > } else { > p_peer_pkey_tbl->used_blocks = peer_max_blocks; > - enforce = FALSE; > + enforce_type = OSM_PARTITION_ENFORCE_TYPE_OFF; > } > > if (!ret) > @@ -545,7 +554,7 @@ static int pkey_mgr_update_peer_port(osm_log_t * p_log, osm_sm_t * sm, > cl_ntoh64(osm_node_get_node_guid(p_node)), > osm_physp_get_port_num(peer), p_node->print_desc); > > - if (pkey_mgr_enforce_partition(p_log, sm, peer, enforce)) > + if (pkey_mgr_enforce_partition(p_log, sm, peer, enforce_type)) > ret = -1; > > return ret; > @@ -599,8 +608,7 @@ int osm_pkey_mgr_process(IN osm_opensm_t * p_osm) > if ((osm_node_get_type(p_port->p_node) != IB_NODE_TYPE_SWITCH) > && pkey_mgr_update_peer_port(&p_osm->log, &p_osm->sm, > &p_osm->subn, p_port, > - !p_osm->subn.opt. > - no_partition_enforcement)) > + p_osm->subn.opt.part_enforce_enum)) > ret = -1; > } > > @@ -624,7 +632,7 @@ int osm_pkey_mgr_process(IN osm_opensm_t * p_osm) > continue; > > /* clear partition enforcement */ > - if (pkey_mgr_enforce_partition(&p_osm->log, &p_osm->sm, p_physp, FALSE)) > + if (pkey_mgr_enforce_partition(&p_osm->log, &p_osm->sm, p_physp, OSM_PARTITION_ENFORCE_TYPE_OFF)) > ret = -1; > } > } > diff --git a/opensm/osm_subnet.c b/opensm/osm_subnet.c > index 0b79d3a..830730a 100644 > --- a/opensm/osm_subnet.c > +++ b/opensm/osm_subnet.c > @@ -342,6 +342,7 @@ static const opt_rec_t opt_tbl[] = { > { "accum_log_file", OPT_OFFSET(accum_log_file), opts_parse_boolean, opts_setup_accum_log_file, 1 }, > { "partition_config_file", OPT_OFFSET(partition_config_file), opts_parse_charp, NULL, 0 }, > { "no_partition_enforcement", OPT_OFFSET(no_partition_enforcement), opts_parse_boolean, NULL, 1 }, > + { "part_enforce", OPT_OFFSET(part_enforce), opts_parse_charp, NULL, 1 }, > { "qos", OPT_OFFSET(qos), opts_parse_boolean, NULL, 1 }, > { "qos_policy_file", OPT_OFFSET(qos_policy_file), opts_parse_charp, NULL, 0 }, > { "dump_files_dir", OPT_OFFSET(dump_files_dir), opts_parse_charp, NULL, 0 }, > @@ -761,6 +762,7 @@ void osm_subn_set_default_opt(IN osm_subn_opt_t * p_opt) > p_opt->log_max_size = 0; > p_opt->partition_config_file = strdup(OSM_DEFAULT_PARTITION_CONFIG_FILE); > p_opt->no_partition_enforcement = FALSE; > + p_opt->part_enforce = OSM_PARTITION_ENFORCE_BOTH; > p_opt->qos = FALSE; > p_opt->qos_policy_file = strdup(OSM_DEFAULT_QOS_POLICY_FILE); > p_opt->accum_log_file = TRUE; > @@ -1129,6 +1131,27 @@ int osm_subn_verify_config(IN osm_subn_opt_t * p_opts) > p_opts->console = OSM_DEFAULT_CONSOLE; > } > > + if (p_opts->no_partition_enforcement == TRUE) { > + strcpy(p_opts->part_enforce, OSM_PARTITION_ENFORCE_OFF); > + p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_OFF; > + } else { > + if (strcmp(p_opts->part_enforce, OSM_PARTITION_ENFORCE_BOTH) == 0) > + p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_BOTH; > + else if (strcmp(p_opts->part_enforce, OSM_PARTITION_ENFORCE_IN) == 0) > + p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_IN; > + else if (strcmp(p_opts->part_enforce, OSM_PARTITION_ENFORCE_OUT) == 0) > + p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_OUT; > + else if (strcmp(p_opts->part_enforce, OSM_PARTITION_ENFORCE_OFF) == 0) > + p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_OFF; > + else { > + log_report(" Invalid Cached Option Value:part_enforce = %s" > + ", Using Default:%s\n", > + p_opts->part_enforce = OSM_PARTITION_ENFORCE_BOTH); > + p_opts->part_enforce = OSM_PARTITION_ENFORCE_BOTH; > + p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_BOTH; > + } > + } > + > if (p_opts->qos) { > subn_verify_qos_set(&p_opts->qos_options, "qos"); > subn_verify_qos_set(&p_opts->qos_ca_options, "qos_ca"); > @@ -1372,9 +1395,16 @@ int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * p_opts) > "# Partition configuration file to be used\n" > "partition_config_file %s\n\n" > "# Disable partition enforcement by switches\n" > - "no_partition_enforcement %s\n\n", > + "no_partition_enforcement %s\n\n" > + "# Partition enforcement type (for switches)\n" > + "# Values are both, out, in and off\n" > + "# Default is both (outbound and inbound enforcement)\n" > + "# When no_partition_enforcement is TRUE, partition\n" > + "# enforcement is off\n" > + "part_enforce %s\n\n", > p_opts->partition_config_file, > - p_opts->no_partition_enforcement ? "TRUE" : "FALSE"); > + p_opts->no_partition_enforcement ? "TRUE" : "FALSE", > + p_opts->part_enforce); > > fprintf(out, > "#\n# SWEEP OPTIONS\n#\n" -- 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