This removes multicast group delayed deletion stuff - we don't need it anymore because MFTs cleanup (in case of group removing) is performed using MLID only (not mgrp content) which is requested by appropriate osm_sm_mgrp_leave() call.
Signed-off-by: Sasha Khapyorsky <sas...@voltaire.com> --- opensm/include/opensm/osm_multicast.h | 7 +--- opensm/opensm/osm_mcast_mgr.c | 13 +----- opensm/opensm/osm_multicast.c | 20 ++++++---- opensm/opensm/osm_sa_mcmember_record.c | 65 ++++--------------------------- 4 files changed, 24 insertions(+), 81 deletions(-) diff --git a/opensm/include/opensm/osm_multicast.h b/opensm/include/opensm/osm_multicast.h index ce3d310..181f0db 100644 --- a/opensm/include/opensm/osm_multicast.h +++ b/opensm/include/opensm/osm_multicast.h @@ -127,7 +127,6 @@ typedef struct osm_mgrp { cl_qmap_t mcm_port_tbl; ib_member_rec_t mcmember_rec; boolean_t well_known; - boolean_t to_be_deleted; unsigned full_members; } osm_mgrp_t; /* @@ -156,11 +155,6 @@ typedef struct osm_mgrp { * is created during the initialization of SM/SA and will be * present even if there are no ports for this group * -* to_be_deleted -* Since groups are deleted only after re-route we need to -* track the fact the group is about to be deleted so we can -* track the fact a new join is actually a create request. -* * SEE ALSO *********/ @@ -413,6 +407,7 @@ osm_mgrp_delete_port(IN osm_subn_t * const p_subn, int osm_mgrp_remove_port(osm_subn_t *subn, osm_log_t *log, osm_mgrp_t *mgrp, osm_mcm_port_t *mcm, uint8_t join_state); +void osm_mgrp_cleanup(osm_subn_t *subn, osm_mgrp_t *mpgr); END_C_DECLS #endif /* _OSM_MULTICAST_H_ */ diff --git a/opensm/opensm/osm_mcast_mgr.c b/opensm/opensm/osm_mcast_mgr.c index f3ddacf..c1d1916 100644 --- a/opensm/opensm/osm_mcast_mgr.c +++ b/opensm/opensm/osm_mcast_mgr.c @@ -1030,21 +1030,12 @@ static ib_api_status_t mcast_mgr_process_mlid(osm_sm_t * sm, uint16_t mlid) mcast_mgr_clear(sm, mlid); mgrp = osm_get_mgrp_by_mlid(sm->p_subn, cl_hton16(mlid)); - if (!mgrp) /* already removed */ - return IB_SUCCESS; - - if (mgrp->full_members) { + if (mgrp) { status = mcast_mgr_build_spanning_tree(sm, mgrp); if (status != IB_SUCCESS) OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0A17: " "Unable to create spanning tree (%s) for mlid " "0x%x\n", ib_get_err_str(status), mlid); - } else if (mgrp->to_be_deleted) { - OSM_LOG(sm->p_log, OSM_LOG_DEBUG, - "Destroying mgrp with lid:0x%x\n", mlid); - sm->p_subn->mgroups[mlid - IB_LID_MCAST_START_HO] = NULL; - cl_fmap_remove_item(&sm->p_subn->mgrp_mgid_tbl, &mgrp->map_item); - osm_mgrp_delete(mgrp); } OSM_LOG_EXIT(sm->p_log); @@ -1120,7 +1111,7 @@ int osm_mcast_mgr_process(osm_sm_t * sm) for (i = 0; i <= sm->p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO; i++) - if (sm->p_subn->mgroups[i]) + if (sm->p_subn->mgroups[i] || sm->mlids_req[i]) mcast_mgr_process_mlid(sm, i + IB_LID_MCAST_START_HO); memset(sm->mlids_req, 0, sm->mlids_req_max); diff --git a/opensm/opensm/osm_multicast.c b/opensm/opensm/osm_multicast.c index 1326161..242eae7 100644 --- a/opensm/opensm/osm_multicast.c +++ b/opensm/opensm/osm_multicast.c @@ -86,11 +86,19 @@ osm_mgrp_t *osm_mgrp_new(IN const ib_net16_t mlid) memset(p_mgrp, 0, sizeof(*p_mgrp)); cl_qmap_init(&p_mgrp->mcm_port_tbl); p_mgrp->mlid = mlid; - p_mgrp->to_be_deleted = FALSE; return p_mgrp; } +void osm_mgrp_cleanup(osm_subn_t *subn, osm_mgrp_t *mgrp) +{ + if (mgrp->full_members || mgrp->well_known) + return; + subn->mgroups[cl_ntoh16(mgrp->mlid) - IB_LID_MCAST_START_HO] = NULL; + cl_fmap_remove_item(&subn->mgrp_mgid_tbl, &mgrp->map_item); + osm_mgrp_delete(mgrp); +} + /********************************************************************** **********************************************************************/ static void mgrp_send_notice(osm_subn_t * subn, osm_log_t * log, @@ -169,10 +177,8 @@ osm_mcm_port_t *osm_mgrp_add_port(IN osm_subn_t * subn, osm_log_t * log, if ((join_state & IB_JOIN_STATE_FULL) && !(prev_join_state & IB_JOIN_STATE_FULL) && - (++p_mgrp->full_members == 1)) { + ++p_mgrp->full_members == 1) mgrp_send_notice(subn, log, p_mgrp, 66); - p_mgrp->to_be_deleted = 0; - } return (p_mcm_port); } @@ -213,11 +219,8 @@ int osm_mgrp_remove_port(osm_subn_t * subn, osm_log_t * log, osm_mgrp_t * mgrp, but only if it is not a well known group */ if ((port_join_state & IB_JOIN_STATE_FULL) && !(new_join_state & IB_JOIN_STATE_FULL) && - (--mgrp->full_members == 0)) { + --mgrp->full_members == 0) mgrp_send_notice(subn, log, mgrp, 67); - if (!mgrp->well_known) - mgrp->to_be_deleted = 1; - } return ret; } @@ -230,6 +233,7 @@ void osm_mgrp_delete_port(osm_subn_t * subn, osm_log_t * log, osm_mgrp_t * mgrp, if (item != cl_qmap_end(&mgrp->mcm_port_tbl)) osm_mgrp_remove_port(subn, log, mgrp, (osm_mcm_port_t *) item, 0xf); + osm_mgrp_cleanup(subn, mgrp); } /********************************************************************** diff --git a/opensm/opensm/osm_sa_mcmember_record.c b/opensm/opensm/osm_sa_mcmember_record.c index e8aecc4..5fc1064 100644 --- a/opensm/opensm/osm_sa_mcmember_record.c +++ b/opensm/opensm/osm_sa_mcmember_record.c @@ -125,36 +125,14 @@ static ib_net16_t get_new_mlid(osm_sa_t * sa, ib_net16_t requested_mlid) return requested_mlid; max = p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO + 1; - for (i = 0; i < max; i++) { - osm_mgrp_t *p_mgrp = sa->p_subn->mgroups[i]; - if (!p_mgrp || p_mgrp->to_be_deleted) + for (i = 0; i < max; i++) + if (!sa->p_subn->mgroups[i]) return cl_hton16(i + IB_LID_MCAST_START_HO); - } return 0; } /********************************************************************* - This procedure is only invoked to cleanup an INTERMEDIATE mgrp. - If there is only one port on the mgrp it means that the current - request was the only member and the group is not really needed. So - we silently drop it. Since it was an intermediate group no need to - re-route it. -**********************************************************************/ -static void cleanup_mgrp(IN osm_sa_t * sa, osm_mgrp_t * mgrp) -{ - /* Remove MGRP only if osm_mcm_port_t count is 0 and - not a well known group */ - 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); - } -} - -/********************************************************************* Add a port to the group. Calculating its PROXY_JOIN by the Port and requester gids. **********************************************************************/ @@ -812,7 +790,6 @@ ib_api_status_t osm_mcmr_rcv_create_new_mgrp(IN osm_sa_t * sa, unsigned zero_mgid, i; uint8_t scope; ib_gid_t *p_mgid; - osm_mgrp_t *p_prev_mgrp; ib_api_status_t status = IB_SUCCESS; ib_member_rec_t mcm_rec = *p_recvd_mcmember_rec; /* copy for modifications */ @@ -913,25 +890,8 @@ ib_api_status_t osm_mcmr_rcv_create_new_mgrp(IN osm_sa_t * sa, (*pp_mgrp)->mcmember_rec.pkt_life |= 2 << 6; /* exactly */ /* Insert the new group in the data base */ - - /* since we might have an old group by that mlid - one whose deletion was delayed for an idle time - we need to deallocate it first */ - p_prev_mgrp = osm_get_mgrp_by_mlid(sa->p_subn, mlid); - if (p_prev_mgrp) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Found previous group for mlid:0x%04x - " - "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: @@ -975,8 +935,7 @@ osm_mgrp_t *osm_get_mgrp_by_mgid(IN osm_sa_t * sa, IN ib_gid_t * p_mgid) } 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) + if (mg != (osm_mgrp_t *)cl_fmap_end(&sa->p_subn->mgrp_mgid_tbl)) return mg; return NULL; @@ -1078,6 +1037,9 @@ static void mcmr_rcv_leave_mgrp(IN osm_sa_t * sa, IN osm_madw_t * p_madw) mcmr_rcv_respond(sa, p_madw, &mcmember_rec); + CL_PLOCK_EXCL_ACQUIRE(sa->p_lock); + osm_mgrp_cleanup(sa->p_subn, p_mgrp); + CL_PLOCK_RELEASE(sa->p_lock); Exit: OSM_LOG_EXIT(sa->p_log); } @@ -1151,7 +1113,7 @@ static void mcmr_rcv_join_mgrp(IN osm_sa_t * sa, IN osm_madw_t * p_madw) /* do we need to create a new group? */ p_mgrp = osm_get_mgrp_by_mgid(sa, &p_recvd_mcmember_rec->mgid); - if (!p_mgrp || p_mgrp->to_be_deleted) { + if (!p_mgrp) { /* check for JoinState.FullMember = 1 o15.0.1.9 */ if ((join_state & 0x01) != 0x01) { char gid_str[INET6_ADDRSTRLEN]; @@ -1235,7 +1197,7 @@ static void mcmr_rcv_join_mgrp(IN osm_sa_t * sa, IN osm_madw_t * p_madw) || !validate_port_caps(sa->p_log, p_mgrp, p_physp) || !(join_state != 0)) { /* since we might have created the new group we need to cleanup */ - cleanup_mgrp(sa, p_mgrp); + osm_mgrp_cleanup(sa->p_subn, p_mgrp); CL_PLOCK_RELEASE(sa->p_lock); OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B12: " "validate_more_comp_fields, validate_port_caps, " @@ -1268,7 +1230,7 @@ static void mcmr_rcv_join_mgrp(IN osm_sa_t * sa, IN osm_madw_t * p_madw) &p_mcmr_port); if (status != IB_SUCCESS) { /* we fail to add the port so we might need to delete the group */ - cleanup_mgrp(sa, p_mgrp); + osm_mgrp_cleanup(sa->p_subn, p_mgrp); CL_PLOCK_RELEASE(sa->p_lock); osm_sa_send_error(sa, p_madw, status == IB_INVALID_PARAMETER ? IB_SA_MAD_STATUS_REQ_INVALID : @@ -1299,7 +1261,6 @@ static void mcmr_rcv_join_mgrp(IN osm_sa_t * sa, IN osm_madw_t * p_madw) osm_mgrp_delete_port(sa->p_subn, sa->p_log, p_mgrp, p_recvd_mcmember_rec->port_gid. unicast.interface_id); - cleanup_mgrp(sa, p_mgrp); CL_PLOCK_RELEASE(sa->p_lock); osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_NO_RESOURCES); goto Exit; @@ -1371,14 +1332,6 @@ static void mcmr_by_comp_mask(osm_sa_t * sa, const ib_member_rec_t * p_rcvd_rec, OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Checking mlid:0x%X\n", cl_ntoh16(p_mgrp->mlid)); - /* the group might be marked for deletion */ - if (p_mgrp->to_be_deleted) { - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, - "Group mlid:0x%X is marked to be deleted\n", - cl_ntoh16(p_mgrp->mlid)); - goto Exit; - } - /* first try to eliminate the group by MGID, MLID, or P_Key */ if ((IB_MCR_COMPMASK_MGID & comp_mask) && memcmp(&p_rcvd_rec->mgid, &p_mgrp->mcmember_rec.mgid, -- 1.6.4.2 _______________________________________________ general mailing list general@lists.openfabrics.org http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general