[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