On 09:18 Tue 04 Aug     , Hal Rosenstock wrote:
> 

Implementation description would be very useful.

What does "initial support" mean?

> Signed-off-by: Hal Rosenstock <[email protected]>
> ---
> diff --git a/opensm/include/opensm/osm_subnet.h 
> b/opensm/include/opensm/osm_subnet.h
> index 6c20de8..8443763 100644
> --- a/opensm/include/opensm/osm_subnet.h
> +++ b/opensm/include/opensm/osm_subnet.h
> @@ -4,6 +4,7 @@
>   * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
>   * Copyright (c) 2008 Xsigo Systems Inc.  All rights reserved.
>   * Copyright (c) 2009 System Fabric Works, Inc. All rights reserved.
> + * Copyright (c) 2009 HNR Consulting. 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
> @@ -204,6 +205,7 @@ typedef struct osm_subn_opt {
>       boolean_t daemon;
>       boolean_t sm_inactive;
>       boolean_t babbling_port_policy;
> +     boolean_t use_optimized_slvl;
>       osm_qos_options_t qos_options;
>       osm_qos_options_t qos_ca_options;
>       osm_qos_options_t qos_sw0_options;
> @@ -428,6 +430,10 @@ typedef struct osm_subn_opt {
>  *    babbling_port_policy
>  *            OpenSM will enforce its "babbling" port policy.
>  *
> +*    use_optimized_slvl
> +*            Use optimized SLtoVLMappingTable programming if
> +*            device indicates it supports this.
> +*
>  *    perfmgr
>  *            Enable or disable the performance manager
>  *
> diff --git a/opensm/opensm/osm_qos.c b/opensm/opensm/osm_qos.c
> index e3dfb58..592e082 100644
> --- a/opensm/opensm/osm_qos.c
> +++ b/opensm/opensm/osm_qos.c
> @@ -1,5 +1,6 @@
>  /*
>   * Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved.
> + * Copyright (c) 2009 HNR Consulting. 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
> @@ -150,7 +151,7 @@ static ib_api_status_t vlarb_update(osm_sm_t * sm, 
> osm_physp_t * p,
>  
>  static ib_api_status_t sl2vl_update_table(osm_sm_t * sm, osm_physp_t * p,
>                                         uint8_t in_port, uint8_t out_port,
> -                                       unsigned force_update,
> +                                       unsigned optimize, unsigned 
> force_update,
>                                         const ib_slvl_table_t * sl2vl_table)
>  {
>       osm_madw_context_t context;
> @@ -177,10 +178,18 @@ static ib_api_status_t sl2vl_update_table(osm_sm_t * 
> sm, osm_physp_t * p,
>           !memcmp(p_tbl, &tbl, sizeof(tbl)))
>               return IB_SUCCESS;
>  
> +     /* both input port and output port wildcarded */
> +     if (optimize && (in_port != 1 || out_port != 1))
> +             return IB_SUCCESS;
> +

This function (sl2vl_update_table()) is called for each in and out ports
combination. I think that instead of calling it N * N times and
filtering out the case 'in == out == 1' you just need it once somewhere
at higher layer.

>       context.slvl_context.node_guid = osm_node_get_node_guid(p_node);
>       context.slvl_context.port_guid = osm_physp_get_port_guid(p);
>       context.slvl_context.set_method = TRUE;
> -     attr_mod = in_port << 8 | out_port;
> +     if (optimize)
> +             /* both input port and output port wildcarded */
> +             attr_mod = 0x30000;
> +     else
> +             attr_mod = in_port << 8 | out_port;
>       return osm_req_set(sm, osm_physp_get_dr_path_ptr(p),
>                          (uint8_t *) & tbl, sizeof(tbl),
>                          IB_MAD_ATTR_SLVL_TABLE, cl_hton32(attr_mod),
> @@ -189,14 +198,17 @@ static ib_api_status_t sl2vl_update_table(osm_sm_t * 
> sm, osm_physp_t * p,
>  
>  static ib_api_status_t sl2vl_update(osm_sm_t * sm, osm_port_t * p_port,
>                                   osm_physp_t * p, uint8_t port_num,
> -                                 unsigned force_update,
> +                                 unsigned optimize, unsigned force_update,
>                                   const struct qos_config *qcfg)
>  {
>       ib_api_status_t status;
>       uint8_t i, num_ports;
>       osm_physp_t *p_physp;
> +     osm_node_t *p_node;
> +     unsigned optimizesl2vl = 0;
>  
> -     if (osm_node_get_type(osm_physp_get_node_ptr(p)) == 
> IB_NODE_TYPE_SWITCH) {
> +     p_node = osm_physp_get_node_ptr(p);
> +     if (osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH) {
>               if (ib_port_info_get_vl_cap(&p->port_info) == 1) {
>                       /* Check port 0's capability mask */
>                       p_physp = p_port->p_physp;
> @@ -205,7 +217,8 @@ static ib_api_status_t sl2vl_update(osm_sm_t * sm, 
> osm_port_t * p_port,
>                            capability_mask & IB_PORT_CAP_HAS_SL_MAP))
>                               return IB_SUCCESS;
>               }
> -             num_ports = osm_node_get_num_physp(osm_physp_get_node_ptr(p));
> +             num_ports = osm_node_get_num_physp(p_node);
> +             optimizesl2vl = 
> ib_switch_info_get_opt_sl2vlmapping(&p_node->sw->switch_info) & optimize;

It should be once per switch, not for each switch port.

>       } else {
>               if (!(p->port_info.capability_mask & IB_PORT_CAP_HAS_SL_MAP))
>                       return IB_SUCCESS;
> @@ -213,8 +226,8 @@ static ib_api_status_t sl2vl_update(osm_sm_t * sm, 
> osm_port_t * p_port,
>       }
>  
>       for (i = 0; i < num_ports; i++) {
> -             status = sl2vl_update_table(sm, p, i, port_num, force_update,
> -                                         &qcfg->sl2vl);
> +             status = sl2vl_update_table(sm, p, i, port_num, optimizesl2vl,
> +                                         force_update, &qcfg->sl2vl);
>               if (status != IB_SUCCESS)
>                       return status;
>       }
> @@ -224,7 +237,8 @@ static ib_api_status_t sl2vl_update(osm_sm_t * sm, 
> osm_port_t * p_port,
>  
>  static int qos_physp_setup(osm_log_t * p_log, osm_sm_t * sm,
>                          osm_port_t * p_port, osm_physp_t * p,
> -                        uint8_t port_num, unsigned force_update,
> +                        uint8_t port_num, unsigned optimize,
> +                        unsigned force_update,
>                          const struct qos_config *qcfg)
>  {
>       ib_api_status_t status;
> @@ -245,7 +259,8 @@ static int qos_physp_setup(osm_log_t * p_log, osm_sm_t * 
> sm,
>       }
>  
>       /* setup SL2VL tables */
> -     status = sl2vl_update(sm, p_port, p, port_num, force_update, qcfg);
> +     status = sl2vl_update(sm, p_port, p, port_num, optimize, force_update,
> +                           qcfg);
>       if (status != IB_SUCCESS) {
>               OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 6203 : "
>                       "failed to update SL2VLMapping tables "
> @@ -307,6 +322,7 @@ int osm_qos_setup(osm_opensm_t * p_osm)
>                                   p_osm->subn.need_update;
>                               if (qos_physp_setup(&p_osm->log, &p_osm->sm,
>                                                   p_port, p_physp, i,
> +                                                 
> p_osm->subn.opt.use_optimized_slvl,
>                                                   force_update, &swe_config))
>                                       ret = -1;
>                       }
> @@ -327,7 +343,7 @@ int osm_qos_setup(osm_opensm_t * p_osm)
>  
>               force_update = p_physp->need_update || p_osm->subn.need_update;
>               if (qos_physp_setup(&p_osm->log, &p_osm->sm, p_port, p_physp,
> -                                 0, force_update, cfg))
> +                                 0, 0, force_update, cfg))
>                       ret = -1;
>       }
>  
> diff --git a/opensm/opensm/osm_slvl_map_rcv.c 
> b/opensm/opensm/osm_slvl_map_rcv.c
> index 9c37442..67c71bd 100644
> --- a/opensm/opensm/osm_slvl_map_rcv.c
> +++ b/opensm/opensm/osm_slvl_map_rcv.c
> @@ -2,6 +2,7 @@
>   * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
>   * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
>   * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
> + * Copyright (c) 2009 HNR Consulting. 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
> @@ -72,7 +73,9 @@ void osm_slvl_rcv_process(IN void *context, IN void *p_data)
>       osm_slvl_context_t *p_context;
>       ib_net64_t port_guid;
>       ib_net64_t node_guid;
> -     uint8_t out_port_num, in_port_num;
> +     uint32_t attr_mod;
> +     uint8_t out_port_num, in_port_num, startinport, startoutport,
> +             endinport, endoutport;
>  
>       CL_ASSERT(sm);
>  
> @@ -111,6 +114,9 @@ void osm_slvl_rcv_process(IN void *context, IN void 
> *p_data)
>                   (uint8_t) cl_ntoh32(p_smp->attr_mod & 0xFF000000);
>               in_port_num =
>                   (uint8_t) cl_ntoh32((p_smp->attr_mod & 0x00FF0000) << 8);
> +             attr_mod = cl_ntoh32(p_smp->attr_mod);
> +             if (attr_mod & 0x30000)
> +                     goto opt_sl2vl;
>               p_physp = osm_node_get_physp_ptr(p_node, out_port_num);
>       } else {
>               p_physp = p_port->p_physp;
> @@ -123,7 +129,7 @@ void osm_slvl_rcv_process(IN void *context, IN void 
> *p_data)
>          all we want is to update the subnet.
>        */
>       OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
> -             "Got SLtoVL get response in_port_num %u out_port_num %u with "
> +             "Received SLtoVL GetResp in_port_num %u out_port_num %u with "
>               "GUID 0x%" PRIx64 " for parent node GUID 0x%" PRIx64 ", TID 0x%"
>               PRIx64 "\n", in_port_num, out_port_num, cl_ntoh64(port_guid),
>               cl_ntoh64(node_guid), cl_ntoh64(p_smp->trans_id));
> @@ -142,6 +148,39 @@ void osm_slvl_rcv_process(IN void *context, IN void 
> *p_data)
>                               out_port_num, p_slvl_tbl, OSM_LOG_DEBUG);
>  
>       osm_physp_set_slvl_tbl(p_physp, p_slvl_tbl, in_port_num);
> +     goto Exit;
> +
> +opt_sl2vl:

I think that you need to use functions here.

> +     OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
> +             "Got optimized SLtoVL get response in_port_num %u out_port_num "
> +             "%u with GUID 0x%" PRIx64 " for parent node GUID 0x%" PRIx64
> +             ", TID 0x%" PRIx64 "\n", in_port_num, out_port_num,
> +             cl_ntoh64(port_guid), cl_ntoh64(node_guid),
> +             cl_ntoh64(p_smp->trans_id));
> +
> +     osm_dump_slvl_map_table(sm->p_log, port_guid, in_port_num,
> +                             out_port_num, p_slvl_tbl, OSM_LOG_DEBUG);
> +
> +     if (attr_mod & 0x10000) {
> +             startoutport = 
> ib_switch_info_is_enhanced_port0(&p_node->sw->switch_info) ? 0 : 1;
> +             endoutport = osm_node_get_num_physp(p_node);
> +     } else
> +             endoutport = startoutport = out_port_num;
> +     if (attr_mod & 0x20000) {
> +             startinport = 
> ib_switch_info_is_enhanced_port0(&p_node->sw->switch_info) ? 0 : 1;
> +             endinport = osm_node_get_num_physp(p_node);
> +     } else
> +             endinport = startinport = in_port_num;
> +
> +     for (out_port_num = startoutport; out_port_num < endoutport;
> +          out_port_num++) {
> +             p_physp = osm_node_get_physp_ptr(p_node, out_port_num);
> +             if (!p_physp)

When could this be NULL?

Sasha

> +                     continue;
> +             for (in_port_num = startinport; in_port_num < endinport;
> +                  in_port_num++)
> +                     osm_physp_set_slvl_tbl(p_physp, p_slvl_tbl, 
> in_port_num);
> +     }
>  
>  Exit:
>       cl_plock_release(sm->p_lock);
> diff --git a/opensm/opensm/osm_subnet.c b/opensm/opensm/osm_subnet.c
> index 0d11811..540165a 100644
> --- a/opensm/opensm/osm_subnet.c
> +++ b/opensm/opensm/osm_subnet.c
> @@ -4,6 +4,7 @@
>   * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
>   * Copyright (c) 2008 Xsigo Systems Inc.  All rights reserved.
>   * Copyright (c) 2009 System Fabric Works, Inc. All rights reserved.
> + * Copyright (c) 2009 HNR Consulting. 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
> @@ -352,6 +353,7 @@ static const opt_rec_t opt_tbl[] = {
>       { "daemon", OPT_OFFSET(daemon), opts_parse_boolean, NULL, 0 },
>       { "sm_inactive", OPT_OFFSET(sm_inactive), opts_parse_boolean, NULL, 1 },
>       { "babbling_port_policy", OPT_OFFSET(babbling_port_policy), 
> opts_parse_boolean, NULL, 1 },
> +     {"use_optimized_slvl", OPT_OFFSET(use_optimized_slvl), 
> opts_parse_boolean, NULL, 1 },
>  #ifdef ENABLE_OSM_PERF_MGR
>       { "perfmgr", OPT_OFFSET(perfmgr), opts_parse_boolean, NULL, 0 },
>       { "perfmgr_redir", OPT_OFFSET(perfmgr_redir), opts_parse_boolean, NULL, 
> 0 },
> @@ -715,6 +717,7 @@ void osm_subn_set_default_opt(IN osm_subn_opt_t * const 
> p_opt)
>       p_opt->daemon = FALSE;
>       p_opt->sm_inactive = FALSE;
>       p_opt->babbling_port_policy = FALSE;
> +     p_opt->use_optimized_slvl = FALSE;
>  #ifdef ENABLE_OSM_PERF_MGR
>       p_opt->perfmgr = FALSE;
>       p_opt->perfmgr_redir = TRUE;
> @@ -1501,10 +1504,13 @@ int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t 
> *const p_opts)
>               "# SM Inactive\n"
>               "sm_inactive %s\n\n"
>               "# Babbling Port Policy\n"
> -             "babbling_port_policy %s\n\n",
> +             "babbling_port_policy %s\n\n"
> +             "# Use Optimized SLtoVLMapping programming if supported by 
> device\n"
> +             "use_optimized_slvl %s\n\n",
>               p_opts->daemon ? "TRUE" : "FALSE",
>               p_opts->sm_inactive ? "TRUE" : "FALSE",
> -             p_opts->babbling_port_policy ? "TRUE" : "FALSE");
> +             p_opts->babbling_port_policy ? "TRUE" : "FALSE",
> +             p_opts->use_optimized_slvl ? "TRUE" : "FALSE");
>  
>  #ifdef ENABLE_OSM_PERF_MGR
>       fprintf(out,
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to