Hi Yevgeny,

On 23:36 Thu 16 Oct     , Yevgeny Kliteynik wrote:
> Replace the unnecessarily complex switch's forwarding table
> implementation with a simple LFT that is implemented as plain
> uint8_t array.
> 
> Signed-off-by: Yevgeny Kliteynik <[EMAIL PROTECTED]>
> ---

[snip...]

> diff --git a/opensm/opensm/osm_switch.c b/opensm/opensm/osm_switch.c
> index 9bf76e0..bdfc7d0 100644
> --- a/opensm/opensm/osm_switch.c
> +++ b/opensm/opensm/osm_switch.c
> @@ -97,9 +97,26 @@ osm_switch_init(IN osm_switch_t * const p_sw,
>       p_sw->num_ports = num_ports;
>       p_sw->need_update = 2;
> 
> -     status = osm_fwd_tbl_init(&p_sw->fwd_tbl, p_si);
> -     if (status != IB_SUCCESS)
> +     /* Initiate the linear forwarding table */
> +
> +     if (!p_si->lin_cap) {
> +             /* This switch does not support linear forwarding tables */
> +             status = IB_UNSUPPORTED;
>               goto Exit;
> +     }
> +
> +     /* The capacity reported by the switch includes LID 0,
> +        so add 1 to the end of the range here for this assert. */
> +        CL_ASSERT(cl_ntoh16(p_si->lin_cap) <= IB_LID_UCAST_END_HO + 1);

Maybe there should be run-time check (not sure since lin_cap is not
really used in other places in the code), but not assertion - any bogus
data received from network should not crash OpenSM. I'm removing this.

> +
> +     p_sw->lft = malloc(IB_LID_UCAST_END_HO + 1);
> +     if (!p_sw->lft) {
> +             status = IB_INSUFFICIENT_MEMORY;
> +             goto Exit;
> +     }
> +
> +     /* Initialize the table to OSM_NO_PATH, which is "invalid port" */
> +     memset(p_sw->lft, OSM_NO_PATH, IB_LID_UCAST_END_HO + 1);
> 
>       p_sw->lft_buf = malloc(IB_LID_UCAST_END_HO + 1);
>       if (!p_sw->lft_buf) {
> @@ -138,7 +155,8 @@ void osm_switch_delete(IN OUT osm_switch_t ** const pp_sw)
> 
>       osm_mcast_tbl_destroy(&p_sw->mcast_tbl);
>       free(p_sw->p_prof);
> -     osm_fwd_tbl_destroy(&p_sw->fwd_tbl);
> +     if (p_sw->lft)
> +             free(p_sw->lft);
>       if (p_sw->lft_buf)
>               free(p_sw->lft_buf);
>       if (p_sw->hops) {
> @@ -176,44 +194,36 @@ osm_switch_t *osm_switch_new(IN osm_node_t * const 
> p_node,
>  /**********************************************************************
>   **********************************************************************/
>  boolean_t
> -osm_switch_get_fwd_tbl_block(IN const osm_switch_t * const p_sw,
> -                          IN const uint32_t block_id,
> -                          OUT uint8_t * const p_block)
> +osm_switch_get_lft_block(IN const osm_switch_t * const p_sw,
> +                      IN const uint32_t block_id,
> +                      OUT uint8_t * const p_block)
>  {
>       uint16_t base_lid_ho;
> -     uint16_t max_lid_ho;
> -     uint16_t lid_ho;
>       uint16_t block_top_lid_ho;
> -     uint32_t lids_per_block;
> -     osm_fwd_tbl_t *p_tbl;
>       boolean_t return_flag = FALSE;
> 
>       CL_ASSERT(p_sw);
>       CL_ASSERT(p_block);
> 
> -     p_tbl = osm_switch_get_fwd_tbl_ptr(p_sw);
> -     max_lid_ho = p_sw->max_lid_ho;
> -     lids_per_block = osm_fwd_tbl_get_lids_per_block(&p_sw->fwd_tbl);
> -     base_lid_ho = (uint16_t) (block_id * lids_per_block);
> +     base_lid_ho = (uint16_t) (block_id * IB_SMP_DATA_SIZE);
> 
> -     if (base_lid_ho <= max_lid_ho) {
> +     if (base_lid_ho <= p_sw->max_lid_ho) {
>               /* Initialize LIDs in block to invalid port number. */
>               memset(p_block, OSM_NO_PATH, IB_SMP_DATA_SIZE);
>               /*
>                  Determine the range of LIDs we can return with this block.
>                */
>               block_top_lid_ho =
> -                 (uint16_t) (base_lid_ho + lids_per_block - 1);
> -             if (block_top_lid_ho > max_lid_ho)
> -                     block_top_lid_ho = max_lid_ho;
> +                 (uint16_t) (base_lid_ho + IB_SMP_DATA_SIZE - 1);
> +             if (block_top_lid_ho > p_sw->max_lid_ho)
> +                     block_top_lid_ho = p_sw->max_lid_ho;
> 
>               /*
>                  Configure the forwarding table with the routing
>                  information for the specified block of LIDs.
>                */
> -             for (lid_ho = base_lid_ho; lid_ho <= block_top_lid_ho; lid_ho++)
> -                     p_block[lid_ho - base_lid_ho] =
> -                         osm_fwd_tbl_get(p_tbl, lid_ho);
> +             memcpy(p_block, &(p_sw->lft[base_lid_ho]),
> +                    block_top_lid_ho - base_lid_ho + 1);

Hmm, why not just

        memcpy(p_block, &p_sw->lft[base_lid_ho], 64);

? And then no need initial memset()?

Sasha
_______________________________________________
general mailing list
general@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to