[ofa-general] Re: [PATCH] osm: bug in dumping opensm.fdbs
Yevgeny Kliteynik
kliteyn at dev.mellanox.co.il
Sat Jul 7 12:18:23 PDT 2007
Sasha Khapyorsky wrote:
> On 00:28 Sat 07 Jul , Yevgeny Kliteynik wrote:
>> Hi Sasha,
>>
>> Sasha Khapyorsky wrote:
>>> 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.
>> Example:
>> - We're dumping table for switch SW_A, and the target is CA.
>> - To get to CA from SW_A, there are at leas two options:
>> 1. SW_A->...->SW_X->...->SW_B->CA
>> 2. SW_A->...->SW_Y->...->SW_B->CA
>> - Fat-tree may chose to go through SW_X when routing from SW_A to CA,
>> and through SW_Y when routing from SW_A to SW_B, hence it might chose
>> different ports on SW_A
>
> Ok, so your are refering incorrect dumping info, and not the routing
> itself?
Yes, sorry if I wasn't clear on this.
>> In the recent optimization for MinHop and Up/Dn, min hop tables creation is
>> done
>> only for switches,
>
> BTW is such optimization is suitable for fat-tree engine?
No. In fact, fat-tree doesn't use these tables for routing - it creates them
as a routing by-product w/o any additional complexity.
-- Yevgeny
> Sasha
>
>> and in order to go from SW_A to CA the algorithm checks
>> which
>> switch is connected to CA (SW_B in this case), and choses the port on SW_A
>> that
>> routes to SW_B, hence routes to SW_B and CA have to be the same (except for
>> the
>> last SW_B->CA hop).
>>
>> -- Yevgeny
>>
>>> 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