[ofa-general] Re: [PATCH] opensm: Bug in coding trying to set vl_arb_high_limit

Hal Rosenstock hal.rosenstock at gmail.com
Wed Jul 18 09:55:53 PDT 2007


Hi again Eitan,

On 7/18/07, Eitan Zahavi <eitan at mellanox.co.il> wrote:
>
> Hi Sasha
>
> When QoS setup is done the code was trying to send updates of
> vl_arb_high_limit by req_set of PORT_INFO with the new data.
> However, at that stage the SM still did not assign LIDs to the ports.
> So the sent PortInfo.base_lid was still zero. The specification does not
> allow for such LIDs (they are considered ilegal).


 Doesn't that really depend on the PortState ? The LID (and SMLID) needs to
be set by ARMED/ACTIVE.

the patch below fixes this by storing the calculated value and later
> using it in link and lid managers.


It's probably better to defer the setting as this patch appears to do.

-- Hal

Eitan
>
> Signed-off-by:  Eitan Zahavi <eitan at mellanox.co.il>
>
> diff --git a/opensm/include/opensm/osm_port.h
> b/opensm/include/opensm/osm_port.h
> index 54ebcfc..5032b1b 100644
> --- a/opensm/include/opensm/osm_port.h
> +++ b/opensm/include/opensm/osm_port.h
> @@ -117,6 +117,7 @@ typedef struct _osm_physp
>    struct _osm_node             *p_node;
>    struct _osm_physp            *p_remote_physp;
>    boolean_t                      healthy;
> +  uint8_t                vl_high_limit;
>    osm_dr_path_t                         dr_path;
>    osm_pkey_tbl_t                 pkeys;
>    ib_vl_arb_table_t              vl_arb[4];
> diff --git a/opensm/opensm/osm_lid_mgr.c b/opensm/opensm/osm_lid_mgr.c
> index bc3f8b3..ed76382 100644
> --- a/opensm/opensm/osm_lid_mgr.c
> +++ b/opensm/opensm/osm_lid_mgr.c
> @@ -1182,6 +1182,14 @@ __osm_lid_mgr_set_physp_pi(
>             ib_port_info_get_port_state(p_old_pi) )
>          send_set = TRUE;
>      }
> +
> +        /* provide the vl_high_limit from the qos mgr */
> +        if (p_mgr->p_subn->opt.no_qos == FALSE)
> +                if (p_physp->vl_high_limit != p_old_pi->vl_high_limit)
> +                {
> +                        send_set = TRUE;
> +                        p_pi->vl_high_limit = p_physp->vl_high_limit;
> +                }
>    }
>    else
>    {
> diff --git a/opensm/opensm/osm_link_mgr.c b/opensm/opensm/osm_link_mgr.c
> index 25f0fc3..3781fd2 100644
> --- a/opensm/opensm/osm_link_mgr.c
> +++ b/opensm/opensm/osm_link_mgr.c
> @@ -354,6 +354,15 @@ __osm_link_mgr_set_physp_pi(
>        context.pi_context.active_transition = FALSE;
>    }
>
> +  /* provide the vl_high_limit from the qos mgr */
> +  if (p_mgr->p_subn->opt.no_qos == FALSE)
> +         if (p_physp->vl_high_limit != p_old_pi->vl_high_limit)
> +         {
> +                 send_set = TRUE;
> +                 p_pi->vl_high_limit = p_physp->vl_high_limit;
> +         }
> +
> +
>    context.pi_context.node_guid = osm_node_get_node_guid( p_node );
>    context.pi_context.port_guid = osm_physp_get_port_guid( p_physp );
>    context.pi_context.set_method = TRUE;
> diff --git a/opensm/opensm/osm_qos.c b/opensm/opensm/osm_qos.c
> index bbb1608..413e200 100644
> --- a/opensm/opensm/osm_qos.c
> +++ b/opensm/opensm/osm_qos.c
> @@ -216,42 +216,6 @@ static ib_api_status_t sl2vl_update(osm_req_t *
> p_req, osm_port_t * p_port,
>         return IB_SUCCESS;
> }
>
> -static ib_api_status_t vl_high_limit_update(osm_req_t * p_req,
> -                                           osm_physp_t * p,
> -                                           const struct qos_config *qcfg)
> -{
> -       uint8_t payload[IB_SMP_DATA_SIZE];
> -       osm_madw_context_t context;
> -       ib_port_info_t *p_pi;
> -
> -       p_pi = &p->port_info;
> -
> -       if (p_pi->vl_high_limit == qcfg->vl_high_limit)
> -               return IB_SUCCESS;
> -
> -       memset(payload, 0, IB_SMP_DATA_SIZE);
> -       memcpy(payload, p_pi, sizeof(ib_port_info_t));
> -
> -       p_pi = (ib_port_info_t *) payload;
> -       ib_port_info_set_state_no_change(p_pi);
> -
> -       p_pi->vl_high_limit = qcfg->vl_high_limit;
> -
> -       context.pi_context.node_guid =
> -           osm_node_get_node_guid(osm_physp_get_node_ptr(p));
> -       context.pi_context.port_guid = osm_physp_get_port_guid(p);
> -       context.pi_context.set_method = TRUE;
> -       context.pi_context.update_master_sm_base_lid = FALSE;
> -       context.pi_context.ignore_errors = FALSE;
> -       context.pi_context.light_sweep = FALSE;
> -       context.pi_context.active_transition = FALSE;
> -
> -       return osm_req_set(p_req, osm_physp_get_dr_path_ptr(p),
> -                          payload, sizeof(payload),
> IB_MAD_ATTR_PORT_INFO,
> -                          cl_hton32(osm_physp_get_port_num(p)),
> -                          CL_DISP_MSGID_NONE, &context);
> -}
> -
> static ib_api_status_t qos_physp_setup(osm_log_t * p_log, osm_req_t *
> p_req,
>                                        osm_port_t * p_port, osm_physp_t *
> p,
>                                        uint8_t port_num,
> @@ -261,16 +225,8 @@ static ib_api_status_t qos_physp_setup(osm_log_t *
> p_log, osm_req_t * p_req,
>
>         /* OpVLs should be ok at this moment - just use it */
>
> -       /* setup VL high limit */
> -       status = vl_high_limit_update(p_req, p, qcfg);
> -       if (status != IB_SUCCESS) {
> -               osm_log(p_log, OSM_LOG_ERROR,
> -                       "qos_physp_setup: ERR 6201 : "
> -                       "failed to update VLHighLimit "
> -                       "for port %" PRIx64 " #%d\n",
> -                       cl_ntoh64(p->port_guid), port_num);
> -               return status;
> -       }
> +       /* setup VL high limit on the physp later to be updated by
> lid/link mgrs */
> +       p->vl_high_limit = qcfg->vl_high_limit;
>
>         /* setup VLArbitration */
>         status = vlarb_update(p_req, p, port_num, qcfg);
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/general/attachments/20070718/2aed6cba/attachment.html>


More information about the general mailing list