Obviously we don't need to re-check a number of switches on a subnet for each multicast group.
Signed-off-by: Sasha Khapyorsky <[email protected]> --- opensm/opensm/osm_mcast_mgr.c | 25 ++++++++++++++++--------- 1 files changed, 16 insertions(+), 9 deletions(-) diff --git a/opensm/opensm/osm_mcast_mgr.c b/opensm/opensm/osm_mcast_mgr.c index 268e1ab..41e837d 100644 --- a/opensm/opensm/osm_mcast_mgr.c +++ b/opensm/opensm/osm_mcast_mgr.c @@ -1035,15 +1035,6 @@ static ib_api_status_t osm_mcast_mgr_process_tree(osm_sm_t * sm, "Processing multicast group 0x%X\n", cl_ntoh16(mlid)); /* - If there are no switches in the subnet, then we have nothing to do. - */ - if (cl_qmap_count(&sm->p_subn->sw_guid_tbl) == 0) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "No switches in subnet. Nothing to do\n"); - goto Exit; - } - - /* Clear the multicast tables to start clean, then build the spanning tree which sets the mcast table bits for each port in the group. @@ -1124,6 +1115,13 @@ int osm_mcast_mgr_process(osm_sm_t * sm) */ CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); + /* If there are no switches in the subnet we have nothing to do. */ + if (cl_qmap_count(&sm->p_subn->sw_guid_tbl) == 0) { + OSM_LOG(sm->p_log, OSM_LOG_DEBUG, + "No switches in subnet. Nothing to do\n"); + goto exit; + } + for (i = 0; i <= sm->p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO; i++) { /* @@ -1151,6 +1149,7 @@ int osm_mcast_mgr_process(osm_sm_t * sm) free(p); } +exit: CL_PLOCK_RELEASE(sm->p_lock); OSM_LOG_EXIT(sm->p_log); @@ -1177,6 +1176,13 @@ int osm_mcast_mgr_process_mgroups(osm_sm_t * sm) /* we need a lock to make sure the p_mgrp is not change other ways */ CL_PLOCK_EXCL_ACQUIRE(sm->p_lock); + /* If there are no switches in the subnet we have nothing to do. */ + if (cl_qmap_count(&sm->p_subn->sw_guid_tbl) == 0) { + OSM_LOG(sm->p_log, OSM_LOG_DEBUG, + "No switches in subnet. Nothing to do\n"); + goto exit; + } + while (!cl_is_qlist_empty(p_list)) { ctx = (osm_mcast_mgr_ctxt_t *) cl_qlist_remove_head(p_list); @@ -1221,6 +1227,7 @@ int osm_mcast_mgr_process_mgroups(osm_sm_t * sm) osm_dump_mcast_routes(sm->p_subn->p_osm); +exit: CL_PLOCK_RELEASE(sm->p_lock); OSM_LOG_EXIT(sm->p_log); return ret; -- 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
