Find MC group by MGID value using fleximap, rather than looping over mlid array.
Signed-off-by: Sasha Khapyorsky <[email protected]> --- Did this some time ago... Not heavy tested yet. opensm/include/opensm/osm_multicast.h | 5 +++-- opensm/include/opensm/osm_subnet.h | 2 ++ opensm/opensm/osm_mcast_mgr.c | 2 ++ opensm/opensm/osm_sa_mcmember_record.c | 30 ++++++++++++------------------ opensm/opensm/osm_subnet.c | 8 ++++++++ 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/opensm/include/opensm/osm_multicast.h b/opensm/include/opensm/osm_multicast.h index a871306..9a47de5 100644 --- a/opensm/include/opensm/osm_multicast.h +++ b/opensm/include/opensm/osm_multicast.h @@ -45,6 +45,7 @@ #include <iba/ib_types.h> #include <complib/cl_qmap.h> +#include <complib/cl_fleximap.h> #include <complib/cl_qlist.h> #include <complib/cl_spinlock.h> #include <opensm/osm_base.h> @@ -120,7 +121,7 @@ typedef struct osm_mcast_mgr_ctxt { * SYNOPSIS */ typedef struct osm_mgrp { - cl_map_item_t map_item; + cl_fmap_item_t map_item; ib_net16_t mlid; osm_mtree_node_t *p_root; cl_qmap_t mcm_port_tbl; @@ -134,7 +135,7 @@ typedef struct osm_mgrp { /* * FIELDS * map_item -* Map Item for qmap linkage. Must be first element!! +* Map Item for fmap linkage. Must be first element!! * * mlid * The network ordered LID of this Multicast Group (must be diff --git a/opensm/include/opensm/osm_subnet.h b/opensm/include/opensm/osm_subnet.h index 59a32ad..c055add 100644 --- a/opensm/include/opensm/osm_subnet.h +++ b/opensm/include/opensm/osm_subnet.h @@ -46,6 +46,7 @@ #include <iba/ib_types.h> #include <complib/cl_qmap.h> +#include <complib/cl_fleximap.h> #include <complib/cl_map.h> #include <complib/cl_ptr_vector.h> #include <complib/cl_list.h> @@ -508,6 +509,7 @@ typedef struct osm_subn { boolean_t first_time_master_sweep; boolean_t coming_out_of_standby; unsigned need_update; + cl_fmap_t mgrp_mgid_tbl; void *mgroups[IB_LID_MCAST_END_HO - IB_LID_MCAST_START_HO + 1]; } osm_subn_t; /* diff --git a/opensm/opensm/osm_mcast_mgr.c b/opensm/opensm/osm_mcast_mgr.c index ea49588..268e1ab 100644 --- a/opensm/opensm/osm_mcast_mgr.c +++ b/opensm/opensm/osm_mcast_mgr.c @@ -1093,6 +1093,8 @@ static ib_api_status_t mcast_mgr_process_mgrp(osm_sm_t * sm, cl_ntoh16(p_mgrp->mlid)); sm->p_subn->mgroups[cl_ntoh16(p_mgrp->mlid) - IB_LID_MCAST_START_HO] = NULL; + cl_fmap_remove_item(&sm->p_subn->mgrp_mgid_tbl, + &p_mgrp->map_item); osm_mgrp_delete(p_mgrp); } diff --git a/opensm/opensm/osm_sa_mcmember_record.c b/opensm/opensm/osm_sa_mcmember_record.c index 5543221..a9e0a3b 100644 --- a/opensm/opensm/osm_sa_mcmember_record.c +++ b/opensm/opensm/osm_sa_mcmember_record.c @@ -148,6 +148,8 @@ static void cleanup_mgrp(IN osm_sa_t * sa, osm_mgrp_t * mgrp) if (cl_is_qmap_empty(&mgrp->mcm_port_tbl) && !mgrp->well_known) { sa->p_subn->mgroups[cl_ntoh16(mgrp->mlid) - IB_LID_MCAST_START_HO] = NULL; + cl_fmap_remove_item(&sa->p_subn->mgrp_mgid_tbl, + &mgrp->map_item); osm_mgrp_delete(mgrp); } } @@ -922,9 +924,14 @@ ib_api_status_t osm_mcmr_rcv_create_new_mgrp(IN osm_sa_t * sa, "Destroying it first\n", cl_ntoh16(mlid)); sa->p_subn->mgroups[cl_ntoh16(mlid) - IB_LID_MCAST_START_HO] = NULL; + cl_fmap_remove_item(&sa->p_subn->mgrp_mgid_tbl, + &p_prev_mgrp->map_item); osm_mgrp_delete(p_prev_mgrp); } + cl_fmap_insert(&sa->p_subn->mgrp_mgid_tbl, + &(*pp_mgrp)->mcmember_rec.mgid, &(*pp_mgrp)->map_item); + sa->p_subn->mgroups[cl_ntoh16(mlid) - IB_LID_MCAST_START_HO] = *pp_mgrp; Exit: @@ -933,18 +940,6 @@ Exit: } /********************************************************************** - *********************************************************************/ -static unsigned match_mgrp_by_mgid(IN osm_mgrp_t * p_mgrp, ib_gid_t * mgid) -{ - /* ignore groups marked for deletion */ - if (p_mgrp->to_be_deleted || - memcmp(&p_mgrp->mcmember_rec.mgid, mgid, sizeof(ib_gid_t))) - return 0; - else - return 1; -} - -/********************************************************************** **********************************************************************/ #define PREFIX_MASK CL_HTON64(0xff10ffff0000ffffULL) #define PREFIX_SIGNATURE CL_HTON64(0xff10601b00000000ULL) @@ -968,7 +963,7 @@ static unsigned match_and_update_ipv6_snm_mgid(ib_gid_t * mgid) osm_mgrp_t *osm_get_mgrp_by_mgid(IN osm_sa_t * sa, IN ib_gid_t * p_mgid) { - int i; + osm_mgrp_t *mg; if (sa->p_subn->opt.consolidate_ipv6_snm_req && match_and_update_ipv6_snm_mgid(p_mgid)) { @@ -979,11 +974,10 @@ osm_mgrp_t *osm_get_mgrp_by_mgid(IN osm_sa_t * sa, IN ib_gid_t * p_mgid) sizeof gid_str)); } - for (i = 0; i <= sa->p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO; - i++) - if (sa->p_subn->mgroups[i] && - match_mgrp_by_mgid(sa->p_subn->mgroups[i], p_mgid)) - return sa->p_subn->mgroups[i]; + mg = (osm_mgrp_t *)cl_fmap_get(&sa->p_subn->mgrp_mgid_tbl, p_mgid); + if (mg != (osm_mgrp_t *)cl_fmap_end(&sa->p_subn->mgrp_mgid_tbl) + && !mg->to_be_deleted) + return mg; return NULL; } diff --git a/opensm/opensm/osm_subnet.c b/opensm/opensm/osm_subnet.c index ec15f8a..e686e3c 100644 --- a/opensm/opensm/osm_subnet.c +++ b/opensm/opensm/osm_subnet.c @@ -394,6 +394,11 @@ static const opt_rec_t opt_tbl[] = { /********************************************************************** **********************************************************************/ +static long compar_mgids(const void *m1, const void *m2) +{ + return memcmp(m1, m2, sizeof(ib_gid_t)); +} + void osm_subn_construct(IN osm_subn_t * const p_subn) { memset(p_subn, 0, sizeof(*p_subn)); @@ -407,6 +412,7 @@ void osm_subn_construct(IN osm_subn_t * const p_subn) cl_qlist_init(&p_subn->prefix_routes_list); cl_qmap_init(&p_subn->rtr_guid_tbl); cl_qmap_init(&p_subn->prtn_pkey_tbl); + cl_fmap_init(&p_subn->mgrp_mgid_tbl, compar_mgids); } /********************************************************************** @@ -462,6 +468,8 @@ void osm_subn_destroy(IN osm_subn_t * const p_subn) osm_prtn_delete(&p_prtn); } + cl_fmap_remove_all(&p_subn->mgrp_mgid_tbl); + for (i = 0; i <= p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO; i++) { p_mgrp = p_subn->mgroups[i]; -- 1.6.3.3 _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
