[ofa-general] Re: [PATCH] osm: bug in dumping opensm.fdbs

Sasha Khapyorsky sashak at voltaire.com
Fri Jul 6 05:12:23 PDT 2007


Hi Yevgeny,

On 10:43 Thu 05 Jul     , Yevgeny Kliteynik wrote:
>  Hi Hal,
> 
>  opensm.fdbs dump function adaptation to the recent changes in min hop tables
>  broke fat-tree routing (or any other future routing that may not use the 
>  same
>  min hop tables creation functions).

Could you please explain how this dump function break the routing for
fat-tree? Thanks.

Sasha

> 
>  -- Yevgeny
> 
>  Signed-off-by: Yevgeny Kliteynik <kliteyn at dev.mellanox.co.il>
>  ---
>   opensm/opensm/osm_ucast_mgr.c |   33 ++++++++++++++++++++++++---------
>   1 files changed, 24 insertions(+), 9 deletions(-)
> 
>  diff --git a/opensm/opensm/osm_ucast_mgr.c b/opensm/opensm/osm_ucast_mgr.c
>  index 5bcb655..cab272e 100644
>  --- a/opensm/opensm/osm_ucast_mgr.c
>  +++ b/opensm/opensm/osm_ucast_mgr.c
>  @@ -242,6 +242,7 @@ __osm_ucast_mgr_dump_path_distribution(
> 
>   /**********************************************************************
>    **********************************************************************/
>  +
>   static void
>   __osm_ucast_mgr_dump_ucast_routes(
>     IN cl_map_item_t *p_map_item,
>  @@ -255,6 +256,7 @@ __osm_ucast_mgr_dump_ucast_routes(
>     uint8_t                  best_port;
>     uint16_t                 max_lid_ho;
>     uint16_t                 lid_ho, base_lid;
>  +  boolean_t                direct_route_exists = FALSE;
>     osm_switch_t* p_sw = (osm_switch_t *)p_map_item;
>     osm_ucast_mgr_t* p_mgr = ((struct ucast_mgr_dump_context *)cxt)->p_mgr;
>     FILE *file = ((struct ucast_mgr_dump_context *)cxt)->file;
>  @@ -300,22 +302,35 @@ __osm_ucast_mgr_dump_ucast_routes(
>       */
>       if( p_port->p_node->sw )
>       {
>  +      /* Target LID is switch.
>  +         Get its base lid and check hop count for this base LID only.*/
>         base_lid = osm_node_get_base_lid(p_port->p_node, 0);
>         base_lid = cl_ntoh16(base_lid);
>         num_hops = osm_switch_get_hop_count( p_sw, base_lid, port_num );
>       }
>       else
>       {
>  -      osm_physp_t *p_physp = p_port->p_physp;
>  -      if( !p_physp || !p_physp->p_remote_physp ||
>  -          !p_physp->p_remote_physp->p_node->sw )
>  -        num_hops = OSM_NO_PATH;
>  +      /* Target LID is not switch (CA or router).
>  +         Check if we have route to this target from current switch.*/
>  +      num_hops = osm_switch_get_hop_count( p_sw, lid_ho, port_num );
>  +      if (num_hops != OSM_NO_PATH)
>  +      {
>  +          direct_route_exists = TRUE;
>  +          base_lid = lid_ho;
>  +      }
>         else
>         {
>  -        base_lid = osm_node_get_base_lid(p_physp->p_remote_physp->p_node, 
>  0);
>  -        base_lid = cl_ntoh16(base_lid);
>  -        num_hops = p_physp->p_remote_physp->p_node->sw == p_sw ?
>  -                   0 : osm_switch_get_hop_count( p_sw, base_lid, port_num 
>  );
>  +        osm_physp_t *p_physp = p_port->p_physp;
>  +        if( !p_physp || !p_physp->p_remote_physp ||
>  +            !p_physp->p_remote_physp->p_node->sw )
>  +          num_hops = OSM_NO_PATH;
>  +        else
>  +        {
>  +          base_lid = osm_node_get_base_lid(p_physp->p_remote_physp->p_node, 
>  0);
>  +          base_lid = cl_ntoh16(base_lid);
>  +          num_hops = p_physp->p_remote_physp->p_node->sw == p_sw ?
>  +                     0 : osm_switch_get_hop_count( p_sw, base_lid, port_num 
>  );
>  +        }
>         }
>       }
> 
>  @@ -326,7 +341,7 @@ __osm_ucast_mgr_dump_ucast_routes(
>       }
> 
>       best_hops = osm_switch_get_least_hops( p_sw, base_lid );
>  -    if (!p_port->p_node->sw)
>  +    if (!p_port->p_node->sw && !direct_route_exists)
>       {
>         best_hops++;
>         num_hops++;
>  -- 
>  1.5.1.4
> 
> 



More information about the general mailing list