[ofa-general] [PATCH] osm: up/dn optimization - improved ranking

Yevgeny Kliteynik kliteyn at dev.mellanox.co.il
Sun May 20 03:17:07 PDT 2007


Hi Sasha,

Sasha Khapyorsky wrote:
> Hi Yevgeny,
> 
> On 18:03 Wed 16 May     , Yevgeny Kliteynik wrote:
>> Hi Hal,
>>
>> This patch optimizes fabric ranking similar to the fat-tree ranking.
>> All the root switches are marked with rank and added to the BFS list,
>> and only then ranking of rest of the fabric begins.
>>
>> Please apply to master. 
>>
>> Signed-off-by: Yevgeny Kliteynik <kliteyn at dev.mellanox.co.il>
>> ---
> 
> Basically looks good. However couple comments below.
> 
>> opensm/opensm/osm_ucast_updn.c |   66 
>> +++++++++++++++++----------------------
>> 1 files changed, 29 insertions(+), 37 deletions(-)
>>
>> diff --git a/opensm/opensm/osm_ucast_updn.c b/opensm/opensm/osm_ucast_updn.c
>> index 5cebd9b..9574216 100644
>> --- a/opensm/opensm/osm_ucast_updn.c
>> +++ b/opensm/opensm/osm_ucast_updn.c
>> @@ -408,53 +408,49 @@ Exit :
>> /*        rank is a SWITCH for BFS purpose */
>> static int
>> updn_subn_rank(
>> -  IN uint64_t root_guid,
>> -  IN uint8_t base_rank,
>> +  IN uint32_t num_guids,
> 
> 'num_guids' should not be fixed-size integer just compiler friendly
> 'unsigned' is fine.

NP.

>> +  IN uint64_t* guid_list,
>>   IN updn_t* p_updn )
>> {
>>   osm_switch_t *p_sw;
>> -  uint32_t rank = base_rank;
>>   osm_physp_t *p_physp, *p_remote_physp;
>>   cl_qlist_t list;
>>   cl_status_t did_cause_update;
>>   struct updn_node *u, *remote_u;
>>   uint8_t num_ports, port_num;
>>   osm_log_t *p_log = &p_updn->p_osm->log;
>> +  uint32_t idx = 0;
> 
> Ditto.

NP
 
>>   OSM_LOG_ENTER( p_log, updn_subn_rank );
>> +  cl_qlist_init(&list);
>>
>> -  p_sw = osm_get_switch_by_guid(&p_updn->p_osm->subn, 
>> cl_hton64(root_guid));
>> -  if(!p_sw)
>> -  {
>> -    osm_log( p_log, OSM_LOG_ERROR,
>> -             "updn_subn_rank: ERR AA05: "
>> -             "Root switch GUID 0x%" PRIx64 " not found\n", root_guid );
>> -    OSM_LOG_EXIT( p_log );
>> -    return 1;
>> -  }
>> -
>> -  osm_log( p_log, OSM_LOG_VERBOSE,
>> -           "updn_subn_rank: "
>> -           "Ranking starts from GUID 0x%" PRIx64 "\n", root_guid );
>> -
>> -  u = p_sw->priv;
>> -  u->is_root = 1;
>> +  /* Rank all the roots and add them to list */
>>
>> -  /* Rank the first guid chosen anyway since it's the base rank */
>> -  osm_log( p_log, OSM_LOG_DEBUG,
>> -           "updn_subn_rank: "
>> -           "Ranking port GUID 0x%" PRIx64 "\n", root_guid );
>> +  for (idx = 0; idx < num_guids; idx++)
>> +  {
>> +    /* Apply the ranking for each guid given by user - bypass illegal ones 
>> */
>> +    p_sw = osm_get_switch_by_guid(&p_updn->p_osm->subn, 
>> cl_hton64(guid_list[idx]));
>> +    if(!p_sw)
>> +    {
>> +      osm_log( p_log, OSM_LOG_ERROR,
>> +               "updn_subn_rank: ERR AA05: "
>> +               "Root switch GUID 0x%" PRIx64 " not found\n", 
>> guid_list[idx] );
>> +      continue;
>> +    }
>>
>> -  __updn_update_rank(u, rank);
>> +    u = p_sw->priv;
>> +    u->is_root = 1;
> 
> Now when root switches are always ranked first 'is_root' field is not
> needed anymore, (!u->rank) answers this.

Agree

>> -  cl_qlist_init(&list);
>> -  cl_qlist_insert_tail(&list, &u->list);
>> +    osm_log( p_log, OSM_LOG_DEBUG,
>> +             "updn_subn_rank: "
>> +             "Ranking root port GUID 0x%" PRIx64 "\n", guid_list[idx] );
>> +    __updn_update_rank(u, 0);
>> +    cl_qlist_insert_tail(&list, &u->list);
>> +  }
>>
>>   /* BFS the list till it's empty */
>>   while (!cl_is_qlist_empty(&list))
>>   {
>> -    rank++;
>> -
>>     u = (struct updn_node *)cl_qlist_remove_head(&list);
>>     /* Go over all remote nodes and rank them (if not already visited) */
>>     p_sw = u->sw;
>> @@ -483,7 +479,7 @@ updn_subn_rank(
>>       {
>>         remote_u = p_remote_physp->p_node->sw->priv;
>>         port_guid = p_remote_physp->port_guid;
>> -        did_cause_update = __updn_update_rank(remote_u, rank);
>> +        did_cause_update = __updn_update_rank(remote_u, u->rank+1);
>>
>>         osm_log( p_log, OSM_LOG_DEBUG,
>>                  "updn_subn_rank: "
>> @@ -500,8 +496,8 @@ updn_subn_rank(
>>   /* Print Summary of ranking */
>>   osm_log( p_log, OSM_LOG_VERBOSE,
>>            "updn_subn_rank: "
>> -           "Rank Info :\n\t Root Guid = 0x%" PRIx64 "\n\t Max Node Rank = 
>> %d\n",
>> -           root_guid, rank );
>> +           "Subnet ranking completed. Max Node Rank = %d\n",
>> +           remote_u->rank );
> 
> 'remote_u' can be not initialized here. Another issue is that it can be
> initialized but to remote switch which has lower than max rank (when
> did_cause_update = 0).

Right, good catch.
I'll issue a new patch.
Thanks.

-- Yevgeny

> The rest is fine.
> 
> Sasha
> 




More information about the general mailing list