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

Sasha Khapyorsky sashak at voltaire.com
Wed May 16 12:49:19 PDT 2007


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.

> +  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.

> 
>   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.

> 
> -  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).

The rest is fine.

Sasha



More information about the general mailing list