[ofa-general] [PATCH] opensm/multicast: merge mcm_port and mcm_info

Sasha Khapyorsky sashak at voltaire.com
Fri Sep 18 08:15:22 PDT 2009


Merge osm_mcm_port (mgrp's joined ports list) and osm_mcm_info (port's
multicast groups list where port is joined in) structures in a single
one - we need a both equivalently and merging simplifies allocation and
cleanup mechanisms dramatically.

As "side effect" it also fixes non-member re-join bug (reported by Eli
couple of months ago) "automatically":

http://lists.openfabrics.org/pipermail/general/2009-May/059644.html

Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
---
 opensm/include/opensm/osm_mcm_port.h |   18 ++++++--
 opensm/include/opensm/osm_port.h     |   81 ----------------------------------
 opensm/opensm/Makefile.am            |    3 +-
 opensm/opensm/osm_drop_mgr.c         |   13 ++---
 opensm/opensm/osm_mcm_port.c         |    8 ++-
 opensm/opensm/osm_multicast.c        |   38 +++++++++++-----
 opensm/opensm/osm_port.c             |   59 ------------------------
 opensm/opensm/osm_sm.c               |    1 -
 8 files changed, 51 insertions(+), 170 deletions(-)

diff --git a/opensm/include/opensm/osm_mcm_port.h b/opensm/include/opensm/osm_mcm_port.h
index 74b6615..4d82df7 100644
--- a/opensm/include/opensm/osm_mcm_port.h
+++ b/opensm/include/opensm/osm_mcm_port.h
@@ -57,6 +57,9 @@
 #endif				/* __cplusplus */
 
 BEGIN_C_DECLS
+
+struct osm_mgrp;
+
 /****s* OpenSM: MCM Port Object/osm_mcm_port_t
 * NAME
 *   osm_mcm_port_t
@@ -72,7 +75,9 @@ BEGIN_C_DECLS
 */
 typedef struct osm_mcm_port {
 	cl_map_item_t map_item;
+	cl_list_item_t list_item;
 	osm_port_t *port;
+	struct osm_mgrp *mgrp;
 	ib_gid_t port_gid;
 	uint8_t scope_state;
 	boolean_t proxy_join;
@@ -85,6 +90,9 @@ typedef struct osm_mcm_port {
 *	port
 *		Reference to the parent port.
 *
+*	mgrp
+*		The pointer to multicast group where this port is member of
+*
 *	port_gid
 *		GID of the member port.
 *
@@ -111,18 +119,20 @@ typedef struct osm_mcm_port {
 *
 * SYNOPSIS
 */
-osm_mcm_port_t *osm_mcm_port_new(IN osm_port_t * port, IN ib_member_rec_t *mcmr,
-				 IN boolean_t proxy_join);
+osm_mcm_port_t *osm_mcm_port_new(IN osm_port_t * port, IN struct osm_mgrp *mgrp,
+				 IN ib_member_rec_t *mcmr, IN boolean_t proxy);
 /*
 * PARAMETERS
 *	port
 *		[in] Pointer to the port object.
-*		GID of the port to add to the multicast group.
+*
+*	mgrp
+*		[in] Pointer to multicast group where this port is joined.
 *
 *	mcmr
 *		[in] Pointer to MCMember record of the join request
 *
-*	proxy_join
+*	proxy
 *		[in] proxy_join state analyzed from the request
 *
 * RETURN VALUES
diff --git a/opensm/include/opensm/osm_port.h b/opensm/include/opensm/osm_port.h
index 0e0d3d2..000e2fe 100644
--- a/opensm/include/opensm/osm_port.h
+++ b/opensm/include/opensm/osm_port.h
@@ -1411,87 +1411,6 @@ osm_get_port_by_base_lid(IN const osm_subn_t * const p_subn,
 *       Port
 *********/
 
-/****f* OpenSM: Port/osm_port_add_mgrp
-* NAME
-*	osm_port_add_mgrp
-*
-* DESCRIPTION
-*	Logically connects a port to a multicast group.
-*
-* SYNOPSIS
-*/
-ib_api_status_t
-osm_port_add_mgrp(IN osm_port_t * const p_port, IN struct osm_mgrp *mgrp);
-/*
-* PARAMETERS
-*	p_port
-*		[in] Pointer to an osm_port_t object.
-*
-*	mgrp
-*		[in] Pointer to the multicast group.
-*
-* RETURN VALUES
-*	IB_SUCCESS
-*	IB_INSUFFICIENT_MEMORY
-*
-* NOTES
-*
-* SEE ALSO
-*	Port object
-*********/
-
-/****f* OpenSM: Port/osm_port_remove_mgrp
-* NAME
-*	osm_port_remove_mgrp
-*
-* DESCRIPTION
-*	Logically disconnects a port from a multicast group.
-*
-* SYNOPSIS
-*/
-void
-osm_port_remove_mgrp(IN osm_port_t * const p_port, IN struct osm_mgrp *mgrp);
-/*
-* PARAMETERS
-*	p_port
-*		[in] Pointer to an osm_port_t object.
-*
-*	mgrp
-*		[in] Pointer to the multicast group.
-*
-* RETURN VALUES
-*	None.
-*
-* NOTES
-*
-* SEE ALSO
-*	Port object
-*********/
-
-/****f* OpenSM: Port/osm_port_remove_all_mgrp
-* NAME
-*	osm_port_remove_all_mgrp
-*
-* DESCRIPTION
-*	Logically disconnects a port from all its multicast groups.
-*
-* SYNOPSIS
-*/
-void osm_port_remove_all_mgrp(IN osm_port_t * const p_port);
-/*
-* PARAMETERS
-*	p_port
-*		[in] Pointer to an osm_port_t object.
-*
-* RETURN VALUES
-*	None.
-*
-* NOTES
-*
-* SEE ALSO
-*	Port object
-*********/
-
 /****f* OpenSM: Physical Port/osm_physp_calc_link_mtu
 * NAME
 *	osm_physp_calc_link_mtu
diff --git a/opensm/opensm/Makefile.am b/opensm/opensm/Makefile.am
index 2d67a95..db7d790 100644
--- a/opensm/opensm/Makefile.am
+++ b/opensm/opensm/Makefile.am
@@ -31,7 +31,7 @@ opensm_SOURCES = main.c osm_console_io.c osm_console.c osm_db_files.c \
 		 osm_db_pack.c osm_drop_mgr.c \
 		 osm_inform.c osm_lid_mgr.c osm_lin_fwd_rcv.c \
 		 osm_link_mgr.c osm_mcast_fwd_rcv.c \
-		 osm_mcast_mgr.c osm_mcast_tbl.c osm_mcm_info.c \
+		 osm_mcast_mgr.c osm_mcast_tbl.c \
 		 osm_mcm_port.c osm_mesh.c osm_mtree.c osm_multicast.c osm_node.c \
 		 osm_node_desc_rcv.c osm_node_info_rcv.c \
 		 osm_opensm.c osm_pkey.c osm_pkey_mgr.c osm_pkey_rcv.c \
@@ -83,7 +83,6 @@ opensminclude_HEADERS = \
 	$(srcdir)/../include/opensm/osm_mad_pool.h \
 	$(srcdir)/../include/opensm/osm_madw.h \
 	$(srcdir)/../include/opensm/osm_mcast_tbl.h \
-	$(srcdir)/../include/opensm/osm_mcm_info.h \
 	$(srcdir)/../include/opensm/osm_mcm_port.h \
 	$(srcdir)/../include/opensm/osm_mesh.h \
 	$(srcdir)/../include/opensm/osm_mtree.h \
diff --git a/opensm/opensm/osm_drop_mgr.c b/opensm/opensm/osm_drop_mgr.c
index 4891bb8..4f98cc9 100644
--- a/opensm/opensm/osm_drop_mgr.c
+++ b/opensm/opensm/osm_drop_mgr.c
@@ -57,7 +57,6 @@
 #include <opensm/osm_switch.h>
 #include <opensm/osm_node.h>
 #include <opensm/osm_helper.h>
-#include <opensm/osm_mcm_info.h>
 #include <opensm/osm_multicast.h>
 #include <opensm/osm_remote_sm.h>
 #include <opensm/osm_inform.h>
@@ -157,7 +156,7 @@ static void drop_mgr_remove_port(osm_sm_t * sm, IN osm_port_t * p_port)
 	ib_net64_t port_guid;
 	osm_port_t *p_port_check;
 	cl_qmap_t *p_sm_guid_tbl;
-	osm_mcm_info_t *p_mcm;
+	osm_mcm_port_t *mcm_port;
 	cl_ptr_vector_t *p_port_lid_tbl;
 	uint16_t min_lid_ho;
 	uint16_t max_lid_ho;
@@ -209,13 +208,11 @@ static void drop_mgr_remove_port(osm_sm_t * sm, IN osm_port_t * p_port)
 
 	drop_mgr_clean_physp(sm, p_port->p_physp);
 
-	p_mcm = (osm_mcm_info_t *) cl_qlist_remove_head(&p_port->mcm_list);
-	while (p_mcm != (osm_mcm_info_t *) cl_qlist_end(&p_port->mcm_list)) {
-		osm_mgrp_delete_port(sm->p_subn, sm->p_log, p_mcm->mgrp,
+	while (!cl_is_qlist_empty(&p_port->mcm_list)) {
+		mcm_port = cl_item_obj(cl_qlist_head(&p_port->mcm_list),
+				       mcm_port, list_item);
+		osm_mgrp_delete_port(sm->p_subn, sm->p_log, mcm_port->mgrp,
 				     p_port->guid);
-		osm_mcm_info_delete(p_mcm);
-		p_mcm =
-		    (osm_mcm_info_t *) cl_qlist_remove_head(&p_port->mcm_list);
 	}
 
 	/* initialize the p_node - may need to get node_desc later */
diff --git a/opensm/opensm/osm_mcm_port.c b/opensm/opensm/osm_mcm_port.c
index 9381bff..56065e6 100644
--- a/opensm/opensm/osm_mcm_port.c
+++ b/opensm/opensm/osm_mcm_port.c
@@ -47,11 +47,12 @@
 #include <stdlib.h>
 #include <string.h>
 #include <opensm/osm_mcm_port.h>
+#include <opensm/osm_multicast.h>
 
 /**********************************************************************
  **********************************************************************/
-osm_mcm_port_t *osm_mcm_port_new(IN osm_port_t *port, IN ib_member_rec_t *mcmr,
-				 IN boolean_t proxy_join)
+osm_mcm_port_t *osm_mcm_port_new(IN osm_port_t *port, IN osm_mgrp_t *mgrp,
+				 IN ib_member_rec_t *mcmr, IN boolean_t proxy)
 {
 	osm_mcm_port_t *p_mcm;
 
@@ -59,9 +60,10 @@ osm_mcm_port_t *osm_mcm_port_new(IN osm_port_t *port, IN ib_member_rec_t *mcmr,
 	if (p_mcm) {
 		memset(p_mcm, 0, sizeof(*p_mcm));
 		p_mcm->port = port;
+		p_mcm->mgrp = mgrp;
 		p_mcm->port_gid = mcmr->port_gid;
 		p_mcm->scope_state = mcmr->scope_state;
-		p_mcm->proxy_join = proxy_join;
+		p_mcm->proxy_join = proxy;
 	}
 
 	return (p_mcm);
diff --git a/opensm/opensm/osm_multicast.c b/opensm/opensm/osm_multicast.c
index b03af48..e775f02 100644
--- a/opensm/opensm/osm_multicast.c
+++ b/opensm/opensm/osm_multicast.c
@@ -50,7 +50,6 @@
 #include <opensm/osm_mtree.h>
 #include <opensm/osm_inform.h>
 #include <opensm/osm_opensm.h>
-#include <opensm/osm_mcm_info.h>
 
 /**********************************************************************
  **********************************************************************/
@@ -95,11 +94,28 @@ osm_mgrp_t *osm_mgrp_new(IN const ib_net16_t mlid)
 
 void osm_mgrp_cleanup(osm_subn_t * subn, osm_mgrp_t * mgrp)
 {
-	if (mgrp->full_members || mgrp->well_known)
+	osm_mcm_port_t *mcm_port;
+
+	if (mgrp->full_members)
 		return;
-	subn->mgroups[cl_ntoh16(mgrp->mlid) - IB_LID_MCAST_START_HO] = NULL;
+
+	osm_mtree_destroy(mgrp->p_root);
+	mgrp->p_root = NULL;
+
+	while (cl_qmap_count(&mgrp->mcm_port_tbl)) {
+		mcm_port = (osm_mcm_port_t *)cl_qmap_head(&mgrp->mcm_port_tbl);
+		cl_qmap_remove_item(&mgrp->mcm_port_tbl, &mcm_port->map_item);
+		cl_qlist_remove_item(&mcm_port->port->mcm_list,
+				     &mcm_port->list_item);
+		osm_mcm_port_delete(mcm_port);
+	}
+
+	if (mgrp->well_known)
+		return;
+
 	cl_fmap_remove_item(&subn->mgrp_mgid_tbl, &mgrp->map_item);
-	osm_mgrp_delete(mgrp);
+	subn->mgroups[cl_ntoh16(mgrp->mlid) - IB_LID_MCAST_START_HO] = NULL;
+	free(mgrp);
 }
 
 /**********************************************************************
@@ -151,7 +167,7 @@ osm_mcm_port_t *osm_mgrp_add_port(IN osm_subn_t * subn, osm_log_t * log,
 			cl_ntoh16(mgrp->mlid));
 	}
 
-	mcm_port = osm_mcm_port_new(port, mcmr, proxy);
+	mcm_port = osm_mcm_port_new(port, mgrp, mcmr, proxy);
 	if (!mcm_port)
 		return NULL;
 
@@ -176,10 +192,7 @@ osm_mcm_port_t *osm_mgrp_add_port(IN osm_subn_t * subn, osm_log_t * log,
 		    ib_member_set_scope_state(prev_scope,
 					      prev_join_state | join_state);
 	} else {
-		if (osm_port_add_mgrp(port, mgrp)) {
-			osm_mcm_port_delete(mcm_port);
-			return NULL;
-		}
+		cl_qlist_insert_tail(&port->mcm_list, &mcm_port->list_item);
 		osm_sm_reroute_mlid(&subn->p_osm->sm, mgrp->mlid);
 	}
 
@@ -230,10 +243,11 @@ void osm_mgrp_remove_port(osm_subn_t * subn, osm_log_t * log, osm_mgrp_t * mgrp,
 		mcmr->scope_state = mcm_port->scope_state;
 	} else {
 		mcmr->scope_state = mcm_port->scope_state;
-		cl_qmap_remove_item(&mgrp->mcm_port_tbl, &mcm_port->map_item);
 		OSM_LOG(log, OSM_LOG_DEBUG, "removing port 0x%" PRIx64 "\n",
 			cl_ntoh64(mcm_port->port->guid));
-		osm_port_remove_mgrp(mcm_port->port, mgrp);
+		cl_qmap_remove_item(&mgrp->mcm_port_tbl, &mcm_port->map_item);
+		cl_qlist_remove_item(&mcm_port->port->mcm_list,
+				     &mcm_port->list_item);
 		osm_mcm_port_delete(mcm_port);
 		osm_sm_reroute_mlid(&subn->p_osm->sm, mgrp->mlid);
 	}
@@ -255,8 +269,8 @@ void osm_mgrp_delete_port(osm_subn_t * subn, osm_log_t * log, osm_mgrp_t * mgrp,
 		mcmrec.scope_state = 0xf;
 		osm_mgrp_remove_port(subn, log, mgrp, (osm_mcm_port_t *) item,
 				     &mcmrec);
+		osm_mgrp_cleanup(subn, mgrp);
 	}
-	osm_mgrp_cleanup(subn, mgrp);
 }
 
 /**********************************************************************
diff --git a/opensm/opensm/osm_port.c b/opensm/opensm/osm_port.c
index 3470381..dc8a768 100644
--- a/opensm/opensm/osm_port.c
+++ b/opensm/opensm/osm_port.c
@@ -51,7 +51,6 @@
 #include <opensm/osm_port.h>
 #include <opensm/osm_node.h>
 #include <opensm/osm_madw.h>
-#include <opensm/osm_mcm_info.h>
 #include <opensm/osm_switch.h>
 
 /**********************************************************************
@@ -132,8 +131,6 @@ void osm_physp_init(IN osm_physp_t * p_physp, IN const ib_net64_t port_guid,
  **********************************************************************/
 void osm_port_delete(IN OUT osm_port_t ** pp_port)
 {
-	/* cleanup all mcm recs attached */
-	osm_port_remove_all_mgrp(*pp_port);
 	free(*pp_port);
 	*pp_port = NULL;
 }
@@ -223,62 +220,6 @@ Found:
 
 /**********************************************************************
  **********************************************************************/
-ib_api_status_t osm_port_add_mgrp(IN osm_port_t * p_port, IN osm_mgrp_t *mgrp)
-{
-	ib_api_status_t status = IB_SUCCESS;
-	osm_mcm_info_t *p_mcm;
-
-	p_mcm = osm_mcm_info_new(mgrp);
-	if (p_mcm)
-		cl_qlist_insert_tail(&p_port->mcm_list,
-				     (cl_list_item_t *) p_mcm);
-	else
-		status = IB_INSUFFICIENT_MEMORY;
-
-	return status;
-}
-
-/**********************************************************************
- **********************************************************************/
-static cl_status_t port_mgrp_find_func(IN const cl_list_item_t * p_list_item,
-				       IN void *context)
-{
-	if (context == ((osm_mcm_info_t *) p_list_item)->mgrp)
-		return CL_SUCCESS;
-	else
-		return CL_NOT_FOUND;
-}
-
-/**********************************************************************
- **********************************************************************/
-void osm_port_remove_mgrp(IN osm_port_t * p_port, IN osm_mgrp_t *mgrp)
-{
-	cl_list_item_t *p_mcm;
-
-	p_mcm = cl_qlist_find_from_head(&p_port->mcm_list, port_mgrp_find_func,
-					mgrp);
-
-	if (p_mcm != cl_qlist_end(&p_port->mcm_list)) {
-		cl_qlist_remove_item(&p_port->mcm_list, p_mcm);
-		osm_mcm_info_delete((osm_mcm_info_t *) p_mcm);
-	}
-}
-
-/**********************************************************************
- **********************************************************************/
-void osm_port_remove_all_mgrp(IN osm_port_t * p_port)
-{
-	cl_list_item_t *p_mcm;
-
-	p_mcm = cl_qlist_remove_head(&p_port->mcm_list);
-	while (p_mcm != cl_qlist_end(&p_port->mcm_list)) {
-		osm_mcm_info_delete((osm_mcm_info_t *) p_mcm);
-		p_mcm = cl_qlist_remove_head(&p_port->mcm_list);
-	}
-}
-
-/**********************************************************************
- **********************************************************************/
 uint8_t osm_physp_calc_link_mtu(IN osm_log_t * p_log,
 				IN const osm_physp_t * p_physp)
 {
diff --git a/opensm/opensm/osm_sm.c b/opensm/opensm/osm_sm.c
index 88f5ebe..6eaee0d 100644
--- a/opensm/opensm/osm_sm.c
+++ b/opensm/opensm/osm_sm.c
@@ -57,7 +57,6 @@
 #include <opensm/osm_log.h>
 #include <opensm/osm_node.h>
 #include <opensm/osm_msgdef.h>
-#include <opensm/osm_mcm_info.h>
 #include <opensm/osm_perfmgr.h>
 #include <opensm/osm_opensm.h>
 
-- 
1.6.5.rc1




More information about the general mailing list