[ofa-general] Re: [PATCH] opensm/QoS: setting SL in the IPoIB MCast groups
Sasha Khapyorsky
sashak at voltaire.com
Mon Mar 24 09:29:30 PDT 2008
Hi Yevgeny,
On 16:49 Mon 24 Mar , Yevgeny Kliteynik wrote:
>
> This is a reworked patch that sets SL in the IPoIB mcast groups
> Note that I'm using functions here! :)
>
> Added mcast mlid to the partition structure.
> This mlid is used later by the QoS manager for quick access
> to the mcast group.
Basically looks fine for me. One question however.
>
> The patch is for master only.
>
> Signed-off-by: Yevgeny Kliteynik <kliteyn at dev.mellanox.co.il>
> ---
> opensm/include/opensm/osm_partition.h | 5 ++
> opensm/opensm/osm_prtn.c | 9 +++-
> opensm/opensm/osm_qos_policy.c | 84 ++++++++++++++++++++++++++------
> 3 files changed, 80 insertions(+), 18 deletions(-)
>
> diff --git a/opensm/include/opensm/osm_partition.h b/opensm/include/opensm/osm_partition.h
> index 70da27d..326aeb6 100644
> --- a/opensm/include/opensm/osm_partition.h
> +++ b/opensm/include/opensm/osm_partition.h
> @@ -97,6 +97,7 @@ BEGIN_C_DECLS
> typedef struct _osm_prtn {
> cl_map_item_t map_item;
> ib_net16_t pkey;
> + ib_net16_t mlid;
Why to not use 'osm_mgrp_t *mgr' instead of mlid and to not access mcast
group directly w/out qmap search?
Sasha
> uint8_t sl;
> cl_map_t full_guid_tbl;
> cl_map_t part_guid_tbl;
> @@ -110,6 +111,10 @@ typedef struct _osm_prtn {
> * pkey
> * The IBA defined P_KEY of this Partition.
> *
> +* mlid
> +* The network ordered LID of the well known Multicast Group
> +* that was created for this partition.
> +*
> * sl
> * The Service Level (SL) associated with this Partiton.
> *
> diff --git a/opensm/opensm/osm_prtn.c b/opensm/opensm/osm_prtn.c
> index 2d0b313..187cff6 100644
> --- a/opensm/opensm/osm_prtn.c
> +++ b/opensm/opensm/osm_prtn.c
> @@ -230,8 +230,10 @@ ib_api_status_t osm_prtn_add_mcgroup(osm_log_t * p_log,
> OSM_LOG(p_log, OSM_LOG_ERROR,
> "Failed to create MC group with pkey 0x%04x\n",
> cl_ntoh16(pkey));
> - if (p_mgrp)
> + if (p_mgrp) {
> p_mgrp->well_known = TRUE;
> + p->mlid = p_mgrp->mlid;
> + }
>
> /* workaround for TS */
> /* FIXME: remove this upon TS fixes */
> @@ -243,8 +245,11 @@ ib_api_status_t osm_prtn_add_mcgroup(osm_log_t * p_log,
>
> status = osm_mcmr_rcv_find_or_create_new_mgrp(p_sa, comp_mask, &mc_rec,
> &p_mgrp);
> - if (p_mgrp)
> + if (p_mgrp) {
> p_mgrp->well_known = TRUE;
> + if (!p->mlid)
> + p->mlid = p_mgrp->mlid;
> + }
>
> return status;
> }
> diff --git a/opensm/opensm/osm_qos_policy.c b/opensm/opensm/osm_qos_policy.c
> index aef1856..1c428e5 100644
> --- a/opensm/opensm/osm_qos_policy.c
> +++ b/opensm/opensm/osm_qos_policy.c
> @@ -763,6 +763,69 @@ static osm_qos_port_group_t *__qos_policy_get_port_group_by_name(
> /***************************************************
> ***************************************************/
>
> +static void __qos_policy_validate_pkey(
> + osm_qos_policy_t * p_qos_policy,
> + osm_qos_match_rule_t * p_qos_match_rule,
> + osm_prtn_t * p_prtn)
> +{
> + uint8_t sl;
> + uint32_t flow;
> + uint8_t hop;
> + osm_mgrp_t * p_mgrp;
> +
> + if (!p_qos_policy || !p_qos_match_rule || !p_prtn)
> + return;
> +
> + if (!p_qos_match_rule->p_qos_level->sl_set ||
> + p_prtn->sl == p_qos_match_rule->p_qos_level->sl)
> + return;
> +
> + /* overriding partition's SL */
> + OSM_LOG(&p_qos_policy->p_subn->p_osm->log, OSM_LOG_ERROR,
> + "ERR AC15: pkey 0x%04X in match rule - "
> + "overriding partition SL (%u) with QoS Level SL (%u)\n",
> + cl_ntoh16(p_prtn->pkey), p_prtn->sl,
> + p_qos_match_rule->p_qos_level->sl);
> + p_prtn->sl = p_qos_match_rule->p_qos_level->sl;
> +
> +
> + /* If this partition is an IPoIB partition, there should
> + be a matching MCast group. Fix this group's SL too */
> +
> + if (!p_prtn->mlid)
> + return;
> +
> + p_mgrp = (osm_mgrp_t *) cl_qmap_get(
> + &p_qos_policy->p_subn->mgrp_mlid_tbl,
> + p_prtn->mlid);
> + if (p_mgrp == (osm_mgrp_t *)
> + cl_qmap_end(&p_qos_policy->p_subn->mgrp_mlid_tbl)) {
> + OSM_LOG(&p_qos_policy->p_subn->p_osm->log, OSM_LOG_ERROR,
> + "ERR AC16: MCast group for partition with "
> + "pkey 0x%04X not found\n",
> + cl_ntoh16(p_prtn->pkey));
> + return;
> + }
> +
> + CL_ASSERT((cl_ntoh16(p_mgrp->mcmember_rec.pkey) & 0x7fff) ==
> + (cl_ntoh16(p_prtn->pkey) & 0x7fff));
> +
> + ib_member_get_sl_flow_hop(p_mgrp->mcmember_rec.sl_flow_hop,
> + &sl, &flow, &hop);
> + if (sl != p_prtn->sl) {
> + OSM_LOG(&p_qos_policy->p_subn->p_osm->log, OSM_LOG_DEBUG,
> + "Updating MCGroup (MLID 0x%04x) SL to "
> + "match partition SL (%u)\n",
> + cl_hton16(p_mgrp->mcmember_rec.mlid),
> + p_prtn->sl);
> + p_mgrp->mcmember_rec.sl_flow_hop =
> + ib_member_set_sl_flow_hop(p_prtn->sl, flow, hop);
> + }
> +}
> +
> +/***************************************************
> + ***************************************************/
> +
> int osm_qos_policy_validate(osm_qos_policy_t * p_qos_policy,
> osm_log_t *p_log)
> {
> @@ -901,27 +964,16 @@ int osm_qos_policy_validate(osm_qos_policy_t * p_qos_policy,
> &p_qos_policy->p_subn->prtn_pkey_tbl, pkey);
>
> if (p_prtn == (osm_prtn_t *)cl_qmap_end(
> - &p_qos_policy->p_subn->prtn_pkey_tbl)) {
> + &p_qos_policy->p_subn->prtn_pkey_tbl))
> /* partition for this pkey not found */
> OSM_LOG(p_log, OSM_LOG_ERROR, "ERR AC14: "
> "pkey 0x%04X in match rule - "
> "partition doesn't exist\n",
> cl_ntoh16(pkey));
> - continue;
> - }
> -
> - if (p_qos_match_rule->p_qos_level->sl_set &&
> - p_prtn->sl != p_qos_match_rule->p_qos_level->sl) {
> - /* overriding partition's SL */
> - OSM_LOG(p_log, OSM_LOG_ERROR, "ERR AC15: "
> - "pkey 0x%04X in match rule - "
> - "overriding partition SL (%u) "
> - "with QoS Level SL (%u)\n",
> - cl_ntoh16(pkey),
> - p_prtn->sl,
> - p_qos_match_rule->p_qos_level->sl);
> - p_prtn->sl = p_qos_match_rule->p_qos_level->sl;
> - }
> + else
> + __qos_policy_validate_pkey(p_qos_policy,
> + p_qos_match_rule,
> + p_prtn);
> }
> }
>
> --
> 1.5.1.4
>
More information about the general
mailing list