[ofa-general] [PATCH] opensm: use mgrp pointer in port mcm_info

Sasha Khapyorsky sashak at voltaire.com
Sun Sep 6 08:49:01 PDT 2009


Port needs to access multicast groups where it is joined to. Now it is
implemented by keeping list of list of mcm_info elements where MLID of
each multicast group is stored. Obviously this assumes single MGID to
MLID mapping model.

This patch changes this so that instead of MLID mcm_info stores pointer
to multicast group object (mgrp). Such model makes it possible to
have MGIDs to MLID compression.

Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
---
 opensm/include/opensm/osm_mcm_info.h |   13 +++++++------
 opensm/include/opensm/osm_port.h     |   13 +++++++------
 opensm/opensm/osm_drop_mgr.c         |   10 +++-------
 opensm/opensm/osm_mcm_info.c         |    8 ++++----
 opensm/opensm/osm_port.c             |   10 +++++-----
 opensm/opensm/osm_sm.c               |    6 +++---
 6 files changed, 29 insertions(+), 31 deletions(-)

diff --git a/opensm/include/opensm/osm_mcm_info.h b/opensm/include/opensm/osm_mcm_info.h
index dec607f..62ae326 100644
--- a/opensm/include/opensm/osm_mcm_info.h
+++ b/opensm/include/opensm/osm_mcm_info.h
@@ -47,6 +47,7 @@
 #include <iba/ib_types.h>
 #include <complib/cl_qlist.h>
 #include <opensm/osm_base.h>
+#include <opensm/osm_multicast.h>
 
 #ifdef __cplusplus
 #  define BEGIN_C_DECLS extern "C" {
@@ -73,15 +74,15 @@ BEGIN_C_DECLS
 */
 typedef struct osm_mcm_info {
 	cl_list_item_t list_item;
-	ib_net16_t mlid;
+	osm_mgrp_t *mgrp;
 } osm_mcm_info_t;
 /*
 * FIELDS
 *	list_item
 *		Linkage structure for cl_qlist.  MUST BE FIRST MEMBER!
 *
-*	mlid
-*		MLID of this multicast group.
+*	mgrp
+*		The pointer to multicast group where this port is member of
 *
 * SEE ALSO
 *********/
@@ -95,11 +96,11 @@ typedef struct osm_mcm_info {
 *
 * SYNOPSIS
 */
-osm_mcm_info_t *osm_mcm_info_new(IN const ib_net16_t mlid);
+osm_mcm_info_t *osm_mcm_info_new(IN osm_mgrp_t *mgrp);
 /*
 * PARAMETERS
-*	mlid
-*		[in] MLID value for this multicast group.
+*	mgrp
+*		[in] the pointer to multicast group.
 *
 * RETURN VALUES
 *	Pointer to an initialized tree node.
diff --git a/opensm/include/opensm/osm_port.h b/opensm/include/opensm/osm_port.h
index 7079e74..0e0d3d2 100644
--- a/opensm/include/opensm/osm_port.h
+++ b/opensm/include/opensm/osm_port.h
@@ -65,6 +65,7 @@ BEGIN_C_DECLS
 */
 struct osm_port;
 struct osm_node;
+struct osm_mgrp;
 
 /****h* OpenSM/Physical Port
 * NAME
@@ -1420,14 +1421,14 @@ osm_get_port_by_base_lid(IN const osm_subn_t * const p_subn,
 * SYNOPSIS
 */
 ib_api_status_t
-osm_port_add_mgrp(IN osm_port_t * const p_port, IN const ib_net16_t mlid);
+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.
 *
-*	mlid
-*		[in] MLID of the multicast group.
+*	mgrp
+*		[in] Pointer to the multicast group.
 *
 * RETURN VALUES
 *	IB_SUCCESS
@@ -1449,14 +1450,14 @@ osm_port_add_mgrp(IN osm_port_t * const p_port, IN const ib_net16_t mlid);
 * SYNOPSIS
 */
 void
-osm_port_remove_mgrp(IN osm_port_t * const p_port, IN const ib_net16_t mlid);
+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.
 *
-*	mlid
-*		[in] MLID of the multicast group.
+*	mgrp
+*		[in] Pointer to the multicast group.
 *
 * RETURN VALUES
 *	None.
diff --git a/opensm/opensm/osm_drop_mgr.c b/opensm/opensm/osm_drop_mgr.c
index c9a4f33..4891bb8 100644
--- a/opensm/opensm/osm_drop_mgr.c
+++ b/opensm/opensm/osm_drop_mgr.c
@@ -158,7 +158,6 @@ static void drop_mgr_remove_port(osm_sm_t * sm, IN osm_port_t * p_port)
 	osm_port_t *p_port_check;
 	cl_qmap_t *p_sm_guid_tbl;
 	osm_mcm_info_t *p_mcm;
-	osm_mgrp_t *p_mgrp;
 	cl_ptr_vector_t *p_port_lid_tbl;
 	uint16_t min_lid_ho;
 	uint16_t max_lid_ho;
@@ -212,12 +211,9 @@ static void drop_mgr_remove_port(osm_sm_t * sm, IN osm_port_t * p_port)
 
 	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)) {
-		p_mgrp = osm_get_mgrp_by_mlid(sm->p_subn, p_mcm->mlid);
-		if (p_mgrp) {
-			osm_mgrp_delete_port(sm->p_subn, sm->p_log,
-					     p_mgrp, p_port->guid);
-			osm_mcm_info_delete((osm_mcm_info_t *) p_mcm);
-		}
+		osm_mgrp_delete_port(sm->p_subn, sm->p_log, p_mcm->mgrp,
+				     p_port->guid);
+		osm_mcm_info_delete(p_mcm);
 		p_mcm =
 		    (osm_mcm_info_t *) cl_qlist_remove_head(&p_port->mcm_list);
 	}
diff --git a/opensm/opensm/osm_mcm_info.c b/opensm/opensm/osm_mcm_info.c
index 0325a34..c07c70b 100644
--- a/opensm/opensm/osm_mcm_info.c
+++ b/opensm/opensm/osm_mcm_info.c
@@ -49,17 +49,17 @@
 
 /**********************************************************************
  **********************************************************************/
-osm_mcm_info_t *osm_mcm_info_new(IN const ib_net16_t mlid)
+osm_mcm_info_t *osm_mcm_info_new(IN osm_mgrp_t *mgrp)
 {
 	osm_mcm_info_t *p_mcm;
 
-	p_mcm = (osm_mcm_info_t *) malloc(sizeof(*p_mcm));
+	p_mcm = malloc(sizeof(*p_mcm));
 	if (p_mcm) {
 		memset(p_mcm, 0, sizeof(*p_mcm));
-		p_mcm->mlid = mlid;
+		p_mcm->mgrp = mgrp;
 	}
 
-	return (p_mcm);
+	return p_mcm;
 }
 
 /**********************************************************************
diff --git a/opensm/opensm/osm_port.c b/opensm/opensm/osm_port.c
index 751c0f0..3470381 100644
--- a/opensm/opensm/osm_port.c
+++ b/opensm/opensm/osm_port.c
@@ -223,12 +223,12 @@ Found:
 
 /**********************************************************************
  **********************************************************************/
-ib_api_status_t osm_port_add_mgrp(IN osm_port_t * p_port, IN ib_net16_t mlid)
+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(mlid);
+	p_mcm = osm_mcm_info_new(mgrp);
 	if (p_mcm)
 		cl_qlist_insert_tail(&p_port->mcm_list,
 				     (cl_list_item_t *) p_mcm);
@@ -243,7 +243,7 @@ ib_api_status_t osm_port_add_mgrp(IN osm_port_t * p_port, IN ib_net16_t mlid)
 static cl_status_t port_mgrp_find_func(IN const cl_list_item_t * p_list_item,
 				       IN void *context)
 {
-	if (*((ib_net16_t *) context) == ((osm_mcm_info_t *) p_list_item)->mlid)
+	if (context == ((osm_mcm_info_t *) p_list_item)->mgrp)
 		return CL_SUCCESS;
 	else
 		return CL_NOT_FOUND;
@@ -251,12 +251,12 @@ static cl_status_t port_mgrp_find_func(IN const cl_list_item_t * p_list_item,
 
 /**********************************************************************
  **********************************************************************/
-void osm_port_remove_mgrp(IN osm_port_t * p_port, IN const ib_net16_t mlid)
+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,
-					&mlid);
+					mgrp);
 
 	if (p_mcm != cl_qlist_end(&p_port->mcm_list)) {
 		cl_qlist_remove_item(&p_port->mcm_list, p_mcm);
diff --git a/opensm/opensm/osm_sm.c b/opensm/opensm/osm_sm.c
index b3ce69a..2794775 100644
--- a/opensm/opensm/osm_sm.c
+++ b/opensm/opensm/osm_sm.c
@@ -520,7 +520,7 @@ ib_api_status_t osm_sm_mcgrp_join(IN osm_sm_t * p_sm, IN const ib_net16_t mlid,
 	 */
 	p_mcm = (osm_mcm_info_t *) cl_qlist_head(&p_port->mcm_list);
 	while (p_mcm != (osm_mcm_info_t *) cl_qlist_end(&p_port->mcm_list)) {
-		if (p_mcm->mlid == mlid) {
+		if (p_mcm->mgrp->mlid == mlid) {
 			OSM_LOG(p_sm->p_log, OSM_LOG_DEBUG,
 				"Found mlid object for Port:"
 				"0x%016" PRIx64 " lid:0x%X\n",
@@ -530,7 +530,7 @@ ib_api_status_t osm_sm_mcgrp_join(IN osm_sm_t * p_sm, IN const ib_net16_t mlid,
 		p_mcm = (osm_mcm_info_t *) cl_qlist_next(&p_mcm->list_item);
 	}
 
-	status = osm_port_add_mgrp(p_port, mlid);
+	status = osm_port_add_mgrp(p_port, p_mgrp);
 	if (status != IB_SUCCESS) {
 		OSM_LOG(p_sm->p_log, OSM_LOG_ERROR, "ERR 2E03: "
 			"Unable to associate port 0x%" PRIx64 " to mlid 0x%X\n",
@@ -590,7 +590,7 @@ ib_api_status_t osm_sm_mcgrp_leave(IN osm_sm_t * p_sm, IN const ib_net16_t mlid,
 	/*
 	 * Walk the list of ports in the group, and remove the appropriate one.
 	 */
-	osm_port_remove_mgrp(p_port, mlid);
+	osm_port_remove_mgrp(p_port, p_mgrp);
 
 	status = sm_mgrp_process(p_sm, p_mgrp);
 Exit:
-- 
1.6.4.2




More information about the general mailing list