On 10:39 Thu 28 Jan , Hal Rosenstock wrote: > On Wed, Jan 27, 2010 at 5:45 AM, Sasha Khapyorsky <[email protected]> wrote: > > On 13:59 Wed 20 Jan , Sasha Khapyorsky wrote: > >> On 13:32 Wed 20 Jan , Slava Strebkov wrote: > >> > "average hops" was chosen instead of "max hops" because in root weight > >> > calculation the number of ports is also important, not only the distance > >> > (hops). > >> > >> But this patch is declared as root switch calculation optimization, not > >> as algorithm change (actually I even missed this part in V1). > > > > I reworked this patch preserving original ("max hops") calculation > > method. Please look at this. > > > > The next step is to evaluate "max hops" -> "average hops" switch and to > > cleanup OSM_VENDOR_INTF_ANAFA macro. > > > > Sasha > > > > > > From: Slava Strebkov <[email protected]> > > Date: Thu, 3 Dec 2009 16:11:30 +0200 > > Subject: [PATCH] opensm: Multicast root switch calculation > > > > Proposed new algorithm for calculation of root switch for multicast > > spanning tree. Only edge switches(those connected to hosts) > > What about switches whose peer port is a router ? Shouldn't they be > included here ?
Yes. > > > and > > switches - multicast members themselves are involved in root calculation. > > This gives improvement, especially on large fabrics, since number of > > switches usually much less then the number of ports, shared same mcast > > group. > > > > Signed-off-by: Slava Strebkov <[email protected]> > > Signed-off-by: Sasha Khapyorsky <[email protected]> > > --- > > opensm/include/opensm/osm_switch.h | 12 +++ > > opensm/opensm/osm_mcast_mgr.c | 149 > > ++++++++++++++++++++++++++--------- > > 2 files changed, 122 insertions(+), 39 deletions(-) > > > > diff --git a/opensm/include/opensm/osm_switch.h > > b/opensm/include/opensm/osm_switch.h > > index 205896d..cb6e5ac 100644 > > --- a/opensm/include/opensm/osm_switch.h > > +++ b/opensm/include/opensm/osm_switch.h > > @@ -109,6 +109,9 @@ typedef struct osm_switch { > > unsigned endport_links; > > unsigned need_update; > > void *priv; > > + cl_map_item_t mgrp_item; > > + uint32_t num_of_mcm; > > + uint8_t is_mc_member; > > } osm_switch_t; > > /* > > * FIELDS > > @@ -151,6 +154,15 @@ typedef struct osm_switch { > > * When set indicates that switch was probably reset, so > > * fwd tables and rest cached data should be flushed > > * > > +* mgrp_item > > +* map item for switch in building mcast tree > > +* > > +* num_of_mcm > > +* number of mcast members(ports) connected to switch > > +* > > +* is_mc_member > > +* whether switch is a mcast member itself > > +* > > * SEE ALSO > > * Switch object > > *********/ > > diff --git a/opensm/opensm/osm_mcast_mgr.c b/opensm/opensm/osm_mcast_mgr.c > > index dce9f2b..5c9d0bc 100644 > > --- a/opensm/opensm/osm_mcast_mgr.c > > +++ b/opensm/opensm/osm_mcast_mgr.c > > @@ -157,50 +157,119 @@ static void mcast_mgr_purge_tree(osm_sm_t * sm, IN > > osm_mgrp_box_t * mbox) > > OSM_LOG_EXIT(sm->p_log); > > } > > > > -static float osm_mcast_mgr_compute_avg_hops(osm_sm_t * sm, cl_qlist_t * l, > > - const osm_switch_t * p_sw) > > +static void mcast_mgr_build_switch_map(osm_sm_t * sm, > > + const cl_qlist_t * port_list, > > + cl_qmap_t * p_mcast_member_sw_tbl) > > { > > - float avg_hops = 0; > > - uint32_t hops = 0; > > - uint32_t num_ports = 0; > > - cl_list_item_t *i; > > + osm_switch_t *remote_sw; > > + cl_list_item_t *list_item; > > + osm_port_t *p_port; > > + ib_net64_t port_guid; > > + osm_physp_t *p_physp_remote; > > + osm_node_t *remote_node; > > osm_mcast_work_obj_t *wobj; > > > > OSM_LOG_ENTER(sm->p_log); > > > > - /* > > - For each member of the multicast group, compute the > > - number of hops to its base LID. > > - */ > > - for (i = cl_qlist_head(l); i != cl_qlist_end(l); i = > > cl_qlist_next(i)) { > > - wobj = cl_item_obj(i, wobj, list_item); > > - hops += osm_switch_get_port_least_hops(p_sw, wobj->p_port); > > - num_ports++; > > + cl_qmap_init(p_mcast_member_sw_tbl); > > + for (list_item = cl_qlist_head(port_list); > > + list_item != cl_qlist_end(port_list); > > + list_item = cl_qlist_next(list_item)) { > > + wobj = cl_item_obj(list_item, wobj, list_item); > > + p_port = wobj->p_port; > > + if (!p_port) > > + continue; > > + if (p_port->p_node->sw) { > > + /* for switches - remote switch would be the switch > > itself */ > > + remote_node = > > osm_physp_get_node_ptr(p_port->p_physp); > > + } else { > > + p_physp_remote = > > osm_physp_get_remote(p_port->p_physp); > > + remote_node = > > osm_physp_get_node_ptr(p_physp_remote); > > + } > > + /* get the remote switch of the mcmember */ > > + remote_sw = remote_node->sw; > > + port_guid = osm_node_get_node_guid(remote_node); > > + if (cl_qmap_get(p_mcast_member_sw_tbl, port_guid) == > > + cl_qmap_end(p_mcast_member_sw_tbl)) { > > + /* insert switch to table */ > > + cl_qmap_insert(p_mcast_member_sw_tbl, > > port_guid, &remote_sw->mgrp_item); > > + /* New element in the table */ > > + if (osm_node_get_type(p_port->p_node) == > > IB_NODE_TYPE_CA) > > + /* for HCA update the MC count on > > the remote switch */ > > Should this be != IB_NODE_TYPE_SWITCH so that both CAs and routers are > included here ? Yes, obviously. Sasha -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
