opensm: Multicast root switch calculation
PATCH v2 1/1 opensm: Multicast root switch calculation
Proposed new algorithm for calculation of root switch for multicast spanning tree. Only edge switches(those connected to hosts) 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.
--- opensm/include/opensm/osm_switch.h | 12 ++++ opensm/opensm/osm_mcast_mgr.c | 129 ++++++++++++++++++++++++++++++++--- 2 files changed, 130 insertions(+), 11 deletions(-)
opensm/include/opensm/osm_switch.h +12 -0
@@ -109,6 +109,9 @@ typedef struct osm_switch {unsigned endport_links;unsigned need_update;void *priv; +cl_map_item_t mcast_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 * +* mcast_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 *********/
opensm/opensm/osm_mcast_mgr.c +118 -11
162 lines not on this page · raw message
Signature · 6 lines
1.6.3.3 -- 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
Hi Slava,
Quoted 9 lines · Slava Strebkov
Proposed new algorithm for calculation of root switch for multicast spanning tree. Only edge switches(those connected to hosts) 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.
---
[snip]
Quoted 26 lines
opensm/opensm/osm_mcast_mgr.c +3
-7@@ -231,32 +342,27 @@ static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l,of the multicast group. **********************************************************************/ static osm_switch_t *mcast_mgr_find_optimal_switch (osm_sm_t * sm, -cl_qlist_t *list) +cl_qlist_t * list) {cl_qmap_t *p_sw_tbl;osm_switch_t *p_sw, *p_best_sw =NULL ;float hops =0 ;float best_hops =10000 ;/* any big # will do */ -#ifdef OSM_VENDOR_INTF_ANAFA -boolean_t use_avg_hops = TRUE;/* anafa2 - bug hca on switch *//* use max hops for root */ -#else -boolean_t use_avg_hops = FALSE;/* use max hops for root */ -#endif - +cl_qmap_t mcast_member_sw_tbl;OSM_LOG_ENTER (sm->p_log); p_sw_tbl = &sm->p_subn->sw_guid_tbl; +mcast_mgr_build_switch_map (sm, list, &mcast_member_sw_tbl);for (p_sw = (osm_switch_t *)cl_qmap_head (p_sw_tbl); p_sw != (osm_switch_t *)cl_qmap_end (p_sw_tbl); p_sw = (osm_switch_t *)cl_qmap_next (&p_sw->map_item)) {
opensm/opensm/osm_mcast_mgr.c static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l, · line 365
Quoted 10 lines
opensm/opensm/osm_mcast_mgr.c +3
-4if (!osm_switch_supports_mcast (p_sw))continue ; -if (use_avg_hops) - hops =osm_mcast_mgr_compute_avg_hops (sm, list, p_sw); -else - hops =osm_mcast_mgr_compute_max_hops (sm, list, p_sw); + hops = +osm_mcast_mgr_compute_avg_hops_weight (sm, p_sw, + &mcast_member_sw_tbl);
Any reason why was root switch computation method changed? By default it was "max hops" based and as far as I can see you changed this to "average hops".
Sasha
Quoted 19 lines
opensm/opensm/osm_mcast_mgr.c +1
-0OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "Switch 0x%016" PRIx64 ", hops = %f\n",@@ -277,6 +383,7 @@ static osm_switch_t *mcast_mgr_find_optimal_switch(osm_sm_t * sm,OSM_LOG (sm->p_log,OSM_LOG_VERBOSE ,"No multicast capable switches detected\n" ); +mcast_mgr_destroy_switch_map (sm, &mcast_member_sw_tbl);OSM_LOG_EXIT (sm->p_log);return p_best_sw; }Signature · 6 lines
1.6.3.3 -- 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
--
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
Hi Sasha,
"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).
Slava
-----Original Message-----
From: Sasha Khapyorsky [mailto:[email protected]] On Behalf Of Sasha Khapyorsky
Sent: Wednesday, January 20, 2010 12:27 PM
To: Slava Strebkov
Cc: [email protected]; Eli Dorfman; Or Gerlitz; Yevgeny Kliteynik
Subject: Re: [PATCH v2] opensm: Multicast root switch calculation
Hi Slava,
Quoted 3 lines · Slava Strebkov
Proposed new algorithm for calculation of root switch for multicast spanning tree. Only edge switches(those connected to hosts) and switches - multicast members themselves are involved in root
calculation.
Quoted 6 lines
This gives improvement, especially on large fabrics, since number of switches usually much less then the number of ports, shared same mcast group.
---
[snip]
Review static float
Quoted 1 line
(quoted diff) +0
-0@@ -231,32 +342,27 @@ static float
osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l,
opensm/opensm/osm_mcast_mgr.c static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l, · line 353
Quoted 2 lines
opensm/opensm/osm_mcast_mgr.c +0
-0of the multicast group.
**********************************************************************/
opensm/opensm/osm_mcast_mgr.c static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l,
Quoted 10 lines
opensm/opensm/osm_mcast_mgr.c +1
-3static osm_switch_t *mcast_mgr_find_optimal_switch (osm_sm_t * sm, -cl_qlist_t *list) +cl_qlist_t * list) {cl_qmap_t *p_sw_tbl;osm_switch_t *p_sw, *p_best_sw =NULL ;float hops =0 ;float best_hops =10000 ;/* any big # will do */ -#ifdef OSM_VENDOR_INTF_ANAFA -boolean_t use_avg_hops = TRUE;/* anafa2 - bug hca on switch
*//* use max hops for root */
Quoted 8 lines
opensm/opensm/osm_mcast_mgr.c +1
-4-#else -boolean_t use_avg_hops = FALSE;/* use max hops for root */ -#endif - +cl_qmap_t mcast_member_sw_tbl;OSM_LOG_ENTER (sm->p_log); p_sw_tbl = &sm->p_subn->sw_guid_tbl;
opensm/opensm/osm_mcast_mgr.c static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l,
Quoted 10 lines
opensm/opensm/osm_mcast_mgr.c +1
-2+mcast_mgr_build_switch_map (sm, list, &mcast_member_sw_tbl);for (p_sw = (osm_switch_t *)cl_qmap_head (p_sw_tbl); p_sw != (osm_switch_t *)cl_qmap_end (p_sw_tbl); p_sw = (osm_switch_t *)cl_qmap_next (&p_sw->map_item)) {if (!osm_switch_supports_mcast (p_sw))continue ; -if (use_avg_hops) - hops = osm_mcast_mgr_compute_avg_hops(sm, list,
p_sw);
Review static float · line 259
Quoted 2 lines
(quoted diff) +0
-2- else - hops = osm_mcast_mgr_compute_max_hops(sm, list,
p_sw);
opensm/opensm/osm_mcast_mgr.c static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l,
Quoted 3 lines
opensm/opensm/osm_mcast_mgr.c +3
-0+ hops = + osm_mcast_mgr_compute_avg_hops_weight(sm, p_sw, +
&mcast_member_sw_tbl);
Any reason why was root switch computation method changed? By default it was "max hops" based and as far as I can see you changed this to "average hops".
Sasha
opensm/opensm/osm_mcast_mgr.c static osm_switch_t
Quoted 4 lines
opensm/opensm/osm_mcast_mgr.c +0
-0OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "Switch 0x%016" PRIx64 ", hops = %f\n",@@ -277,6 +383,7 @@ static osm_switch_t
*mcast_mgr_find_optimal_switch(osm_sm_t * sm,
Quoted 12 lines
opensm/opensm/osm_mcast_mgr.c +1
-0OSM_LOG (sm->p_log,OSM_LOG_VERBOSE ,"No multicast capable switches detected\n" ); +mcast_mgr_destroy_switch_map (sm, &mcast_member_sw_tbl);OSM_LOG_EXIT (sm->p_log);return p_best_sw; }Signature · 4 lines
1.6.3.3 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma"
in
Quoted 3 lines
the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
--
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
Quoted 3 lines · Slava Strebkov
"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).
If you think that an algorithm should be changed we need to handle this separately.
And there could be a discussion - I have report that some days ago credit loop issue was observed when "average hops" method was used (and then it was replaced by "max hops"). I don't have much details about this case and cannot be sure that it was not "false alarm" (or outdated information), but anyway I think that we should be careful here.
Sasha
Quoted 89 lines
-----Original Message-----
From: Sasha Khapyorsky [mailto:[email protected]] On Behalf Of Sasha Khapyorsky
Sent: Wednesday, January 20, 2010 12:27 PM
To: Slava Strebkov
Cc: [email protected]; Eli Dorfman; Or Gerlitz; Yevgeny Kliteynik
Subject: Re: [PATCH v2] opensm: Multicast root switch calculationHi Slava,
Quoted 3 lines · Slava Strebkov
Proposed new algorithm for calculation of root switch for multicast spanning tree. Only edge switches(those connected to hosts) and switches - multicast members themselves are involved in root
calculation.
Quoted 6 lines
This gives improvement, especially on large fabrics, since number of switches usually much less then the number of ports, shared same mcast group.
---
[snip]
Review static float
Quoted 1 line
(quoted diff) +0
-0@@ -231,32 +342,27 @@ static floatosm_mcast_mgr_compute_max_hops(osm_sm_t * sm,
cl_qlist_t* l,opensm/opensm/osm_mcast_mgr.c static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l, · line 353
Quoted 2 lines
opensm/opensm/osm_mcast_mgr.c +0
-0of the multicast group.**********************************************************************/
opensm/opensm/osm_mcast_mgr.c static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l,
Quoted 10 lines
opensm/opensm/osm_mcast_mgr.c +1
-3static osm_switch_t *mcast_mgr_find_optimal_switch (osm_sm_t * sm, -cl_qlist_t *list) +cl_qlist_t * list) {cl_qmap_t *p_sw_tbl;osm_switch_t *p_sw, *p_best_sw =NULL ;float hops =0 ;float best_hops =10000 ;/* any big # will do */ -#ifdef OSM_VENDOR_INTF_ANAFA -boolean_t use_avg_hops = TRUE;/* anafa2 - bug hca on switch *//* use max hops for root */
Quoted 8 lines
opensm/opensm/osm_mcast_mgr.c +1
-4-#else -boolean_t use_avg_hops = FALSE;/* use max hops for root */ -#endif - +cl_qmap_t mcast_member_sw_tbl;OSM_LOG_ENTER (sm->p_log); p_sw_tbl = &sm->p_subn->sw_guid_tbl;opensm/opensm/osm_mcast_mgr.c static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l,
Quoted 10 lines
opensm/opensm/osm_mcast_mgr.c +1
-2+mcast_mgr_build_switch_map (sm, list, &mcast_member_sw_tbl);for (p_sw = (osm_switch_t *)cl_qmap_head (p_sw_tbl); p_sw != (osm_switch_t *)cl_qmap_end (p_sw_tbl); p_sw = (osm_switch_t *)cl_qmap_next (&p_sw->map_item)) {if (!osm_switch_supports_mcast (p_sw))continue ; -if (use_avg_hops) - hops = osm_mcast_mgr_compute_avg_hops(sm, list,
p_sw);Review static float · line 259
Quoted 2 lines
(quoted diff) +0
-2- else - hops = osm_mcast_mgr_compute_max_hops(sm, list,
p_sw);opensm/opensm/osm_mcast_mgr.c static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l,
Quoted 3 lines
opensm/opensm/osm_mcast_mgr.c +3
-0+ hops = + osm_mcast_mgr_compute_avg_hops_weight(sm, p_sw, +
&mcast_member_sw_tbl);Any reason why was root switch computation method changed? By default it was "max hops" based and as far as I can see you changed this to "average hops".
Sasha
opensm/opensm/osm_mcast_mgr.c static osm_switch_t
Quoted 4 lines
opensm/opensm/osm_mcast_mgr.c +0
-0OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "Switch 0x%016" PRIx64 ", hops = %f\n",@@ -277,6 +383,7 @@ static osm_switch_t*mcast_mgr_find_optimal_switch(osm_sm_t * sm,
Quoted 10 lines
opensm/opensm/osm_mcast_mgr.c +1
-0OSM_LOG (sm->p_log,OSM_LOG_VERBOSE ,"No multicast capable switches detected\n" ); +mcast_mgr_destroy_switch_map (sm, &mcast_member_sw_tbl);OSM_LOG_EXIT (sm->p_log);return p_best_sw; }Signature · 1 line
1.6.3.3
Quoted 7 lines
Quoted 2 lines
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma"in
Quoted 3 lines
the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
--
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
Quoted 7 lines · Sasha Khapyorsky
Quoted 3 lines · Slava Strebkov
"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 <slavas-hKgKHo2Ms0F+cjeuK/[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) 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.
--- opensm/include/opensm/osm_switch.h | 12 +++ opensm/opensm/osm_mcast_mgr.c | 149 ++++++++++++++++++++++++++--------- 2 files changed, 122 insertions(+), 39 deletions(-)
opensm/include/opensm/osm_switch.h +12 -0
@@ -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 *********/
opensm/opensm/osm_mcast_mgr.c +110 -39
213 lines not on this page · raw message
Signature · 6 lines
1.6.6.1 -- 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
Quoted 18 lines · Sasha Khapyorsky
Quoted 7 lines · Sasha Khapyorsky
Quoted 3 lines · Slava Strebkov
"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_ANAFAmacro.Sasha
Quoted 6 lines
From: Slava Strebkov <slavas-hKgKHo2Ms0F+cjeuK/[email protected]>
Date: Thu, 3 Dec 2009 16:11:30 +0200
Subject: [PATCH] opensm: Multicast root switch calculationProposed 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 ?
Quoted 94 lines
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.---
opensm/include/opensm/osm_switch.h | 12 +++opensm/opensm/osm_mcast_mgr.c| 149 ++++++++++++++++++++++++++---------2 files changed, 122 insertions(+), 39 deletions(-)opensm/include/opensm/osm_switch.h +12
-0@@ -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 *********/ opensm/opensm/osm_mcast_mgr.c +24
-14@@ -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); + }
opensm/opensm/osm_mcast_mgr.c static void mcast_mgr_purge_tree(osm_sm_t * sm, IN osm_mgrp_box_t * mbox) · line 198
Quoted 10 lines
opensm/opensm/osm_mcast_mgr.c +10
-0+ /* 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 ?
-- Hal
Quoted 164 lines
opensm/opensm/osm_mcast_mgr.c +21
-7+ remote_sw->num_of_mcm++; + else + /* the switch is MC memeber */ + remote_sw->is_mc_member = 1; + } } + OSM_LOG_EXIT(sm->p_log); +} - /* - We should be here if there aren't any ports in the group. - */ - CL_ASSERT(num_ports); +static void mcast_mgr_destroy_switch_map (osm_sm_t * sm, + cl_qmap_t *p_mcast_member_sw_tbl) +{ + cl_map_item_t *p_item; + osm_switch_t *p_sw; - if (num_ports != 0) - avg_hops = (float)(hops / num_ports); + OSM_LOG_ENTER(sm->p_log); + p_item = cl_qmap_head(p_mcast_member_sw_tbl); + while (p_item != cl_qmap_end(p_mcast_member_sw_tbl)) { + p_sw = PARENT_STRUCT(p_item, osm_switch_t, mgrp_item); + p_sw->num_of_mcm = 0; + p_sw->is_mc_member = 0; + p_item = cl_qmap_next(p_item); + } + cl_qmap_remove_all(p_mcast_member_sw_tbl); OSM_LOG_EXIT(sm->p_log); - return avg_hops; } /**********************************************************************Calculate the maximal "min hops" from the given switch to any of the group HCAs **********************************************************************/
opensm/opensm/osm_mcast_mgr.c +3
-2-static float osm_mcast_mgr_compute_max_hops (osm_sm_t * sm,cl_qlist_t * l, - const osm_switch_t * p_sw) +#ifdef OSM_VENDOR_INTF_ANAFA +static float osm_mcast_mgr_compute_avg_hops (osm_sm_t * sm,cl_qmap_t * m, + const osm_switch_t * this_sw){
-uint32_tmax_hops= 0;
+ floatavg_hops= 0;
uint32_t hops = 0;
-cl_list_item_t*i;
-osm_mcast_work_obj_t*wobj;
+uint32_tnum_ports= 0;
+uint16_tlid;
+uint32_tleast_hops;
+cl_map_item_t*i;
+osm_switch_t*sw;opensm/opensm/osm_mcast_mgr.c +31
-0+ + OSM_LOG_ENTER(sm->p_log); + + for (i = cl_qmap_head(m); i != cl_qmap_end(m); i = cl_qmap_next(i)) { + sw = cl_item_obj(i, sw, mcast_item); + lid = cl_ntoh16(osm_node_get_base_lid(sw->p_node, 0)); + least_hops = osm_switch_get_least_hops(this_sw, lid); + /* for all host that are MC members and attached to the switch, + we should add the (least_hops + 1) * number_of_such_hosts. + If switch itself is in the MC, we should add the least_hops only */ + hops += (least_hops + 1) * sw->num_of_mcm + + least_hops * sw->is_mc_member; + num_ports += sw->num_of_mcm + sw->is_mc_member; + } + + /* We should be here if there aren't any ports in the group. */ + CL_ASSERT(num_ports); + + avg_hops = (float)(hops / num_ports); + + OSM_LOG_EXIT(sm->p_log); + return avg_hops; +} +#else +static float osm_mcast_mgr_compute_max_hops (osm_sm_t * sm,cl_qmap_t * m, + const osm_switch_t * this_sw) +{ + uint32_t max_hops = 0, hops; + uint16_t lid; + cl_map_item_t *i; + osm_switch_t *sw;OSM_LOG_ENTER(sm->p_log);
opensm/opensm/osm_mcast_mgr.c +0
-0@@ -208,9 +277,11 @@ static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l,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);
+ for (i =cl_qmap_head(m); i !=cl_qmap_end(m); i =cl_qmap_next(i)) {
+ sw =cl_item_obj(i, sw, mgrp_item);
+ lid =cl_ntoh16(osm_node_get_base_lid(sw->p_node, 0));
+ hops =osm_switch_get_least_hops(this_sw, lid);
+ hops = (hops + 1) *sw->num_of_mcm+ hops *sw->is_mc_member; if (hops >max_hops)
max_hops = hops;
}opensm/opensm/osm_mcast_mgr.c +1
-0@@ -222,6 +293,7 @@ static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l, OSM_LOG_EXIT(sm->p_log); return (float)max_hops; } +#endif /**********************************************************************This function attempts to locate the optimal switch for the
opensm/opensm/osm_mcast_mgr.c +0
-0@@ -230,32 +302,30 @@ static float osm_mcast_mgr_compute_max_hops(osm_sm_t * sm, cl_qlist_t * l,of the multicast group. **********************************************************************/ static
osm_switch_t*mcast_mgr_find_optimal_switch(osm_sm_t * sm,
- cl_qlist_t *list)
+ cl_qlist_t * list) {
+cl_qmap_tmgrp_sw_map;
cl_qmap_t*p_sw_tbl;
osm_switch_t*p_sw,*p_best_sw= NULL;
float hops = 0;
floatbest_hops= 10000; /* any big # will do */opensm/opensm/osm_mcast_mgr.c +0
-5-#ifdef OSM_VENDOR_INTF_ANAFA - boolean_t use_avg_hops = TRUE; /* anafa2 - bug hca on switch *//* use max hops for root */ -#else - boolean_t use_avg_hops = FALSE; /* use max hops for root */ -#endif OSM_LOG_ENTER(sm->p_log);
p_sw_tbl =
&sm->p_subn->sw_guid_tbl;+
mcast_mgr_build_switch_map(sm, list, &mgrp_sw_map); for (p_sw= (osm_switch_t*)cl_qmap_head(p_sw_tbl);p_sw!= (osm_switch_t*)cl_qmap_end(p_sw_tbl);p_sw= (osm_switch_t*)cl_qmap_next(&p_sw->map_item)) { if (!osm_switch_supports_mcast(p_sw)) continue;- if (
use_avg_hops)
- hops =osm_mcast_mgr_compute_avg_hops(sm, list, p_sw);
- else
- hops =osm_mcast_mgr_compute_max_hops(sm, list, p_sw);opensm/opensm/osm_mcast_mgr.c +5
-0+#ifdef OSM_VENDOR_INTF_ANAFA + hops = osm_mcast_mgr_compute_avg_hops(sm, &mgrp_sw_map, p_sw); +#else + hops = osm_mcast_mgr_compute_max_hops(sm, &mgrp_sw_map, p_sw); +#endif OSM_LOG(sm->p_log,
OSM_LOG_DEBUG, "Switch 0x%016" PRIx64 ", hops = %f\n",opensm/opensm/osm_mcast_mgr.c +1
-1@@ -276,6 +346,7 @@ static osm_switch_t *mcast_mgr_find_optimal_switch(osm_sm_t * sm, OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, "No multicast capable switches detected\n"); + mcast_mgr_destroy_switch_map(sm, &mgrp_sw_map); OSM_LOG_EXIT(sm->p_log); return p_best_sw; } --1.6.6.1
Quoted 5 lines
--
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
--
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
Quoted 23 lines · Hal Rosenstock
Quoted 22 lines · Sasha Khapyorsky
Quoted 7 lines · Sasha Khapyorsky
Quoted 3 lines · Slava Strebkov
"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_ANAFAmacro.Sasha
From: Slava Strebkov <slavas-hKgKHo2Ms0F+cjeuK/[email protected]>
Date: Thu, 3 Dec 2009 16:11:30 +0200
Subject: [PATCH] opensm: Multicast root switch calculation
Quoted 5 lines
Quoted 2 lines
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.
Quoted 100 lines
Quoted 100 lines
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.---
opensm/include/opensm/osm_switch.h | 12 +++opensm/opensm/osm_mcast_mgr.c| 149 ++++++++++++++++++++++++++---------2 files changed, 122 insertions(+), 39 deletions(-)opensm/include/opensm/osm_switch.h +12
-0@@ -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 *********/ opensm/opensm/osm_mcast_mgr.c +29
-14@@ -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)) {
Quoted 8 lines
opensm/opensm/osm_mcast_mgr.c static void mcast_mgr_purge_tree(osm_sm_t * sm, IN osm_mgrp_box_t * mbox) · line 198
Quoted 5 lines
opensm/opensm/osm_mcast_mgr.c +5
-0+ /* 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_SWITCHso 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
PATCH v4 1/1 opensm: Multicast root switch calculation
From: Slava Strebkov <slavas-hKgKHo2Ms0F+cjeuK/[email protected]>
Proposed new algorithm for calculation of root switch for multicast spanning tree. Only edge switches(those connected to hosts or routers) 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.
--- opensm/include/opensm/osm_switch.h | 12 +++ opensm/opensm/osm_mcast_mgr.c | 149 ++++++++++++++++++++++++++--------- 2 files changed, 122 insertions(+), 39 deletions(-)
opensm/include/opensm/osm_switch.h +12 -0
@@ -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 *********/
opensm/opensm/osm_mcast_mgr.c +110 -39
213 lines not on this page · raw message
Signature · 6 lines
1.6.6.1 -- 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
T24gV2VkLCBGZWIgMywgMjAxMCBhdCA1OjM5IEFNLCBTYXNoYSBLaGFweW9yc2t5IDxzYXNoYWtA dm9sdGFpcmUuY29tPiB3cm90ZToKPgo+IEZyb206IFNsYXZhIFN0cmVia292IDxzbGF2YXNAVm9s dGFpcmUuQ09NPgo+Cj4gUHJvcG9zZWQgbmV3IGFsZ29yaXRobSBmb3IgY2FsY3VsYXRpb24gb2Yg cm9vdCBzd2l0Y2ggZm9yIG11bHRpY2FzdAo+IHNwYW5uaW5nIHRyZWUuIE9ubHkgZWRnZSBzd2l0 Y2hlcyh0aG9zZSBjb25uZWN0ZWQgdG8gaG9zdHMgb3Igcm91dGVycykKPiBhbmQgc3dpdGNoZXMg LSBtdWx0aWNhc3QgbWVtYmVycyB0aGVtc2VsdmVzIGFyZSBpbnZvbHZlZCBpbiByb290Cj4gY2Fs Y3VsYXRpb24uIFRoaXMgZ2l2ZXMgaW1wcm92ZW1lbnQsIGVzcGVjaWFsbHkgb24gbGFyZ2UgZmFi cmljcywgc2luY2UKPiBudW1iZXIgb2Ygc3dpdGNoZXMgdXN1YWxseSBtdWNoIGxlc3MgdGhlbiB0 aGUgbnVtYmVyIG9mIHBvcnRzLCBzaGFyZWQKPiBzYW1lIG1jYXN0IGdyb3VwLgo+Cj4gU2lnbmVk LW9mZi1ieTogU2xhdmEgU3RyZWJrb3YgPHNsYXZhc0B2b2x0YWlyZS5jb20+Cj4gU2lnbmVkLW9m Zi1ieTogU2FzaGEgS2hhcHlvcnNreSA8c2FzaGFrQHZvbHRhaXJlLmNvbT4KPiAtLS0KPiDCoG9w ZW5zbS9pbmNsdWRlL29wZW5zbS9vc21fc3dpdGNoLmggfCDCoCAxMiArKysKPiDCoG9wZW5zbS9v cGVuc20vb3NtX21jYXN0X21nci5jIMKgIMKgIMKgfCDCoDE0OSArKysrKysrKysrKysrKysrKysr KysrKysrKy0tLS0tLS0tLQo+IMKgMiBmaWxlcyBjaGFuZ2VkLCAxMjIgaW5zZXJ0aW9ucygrKSwg MzkgZGVsZXRpb25zKC0pCj4KPiBkaWZmIC0tZ2l0IGEvb3BlbnNtL2luY2x1ZGUvb3BlbnNtL29z bV9zd2l0Y2guaCBiL29wZW5zbS9pbmNsdWRlL29wZW5zbS9vc21fc3dpdGNoLmgKPiBpbmRleCAy MDU4OTZkLi5jYjZlNWFjIDEwMDY0NAo+IC0tLSBhL29wZW5zbS9pbmNsdWRlL29wZW5zbS9vc21f c3dpdGNoLmgKPiArKysgYi9vcGVuc20vaW5jbHVkZS9vcGVuc20vb3NtX3N3aXRjaC5oCj4gQEAg LTEwOSw2ICsxMDksOSBAQCB0eXBlZGVmIHN0cnVjdCBvc21fc3dpdGNoIHsKPiDCoCDCoCDCoCDC oHVuc2lnbmVkIGVuZHBvcnRfbGlua3M7Cj4gwqAgwqAgwqAgwqB1bnNpZ25lZCBuZWVkX3VwZGF0 ZTsKPiDCoCDCoCDCoCDCoHZvaWQgKnByaXY7Cj4gKyDCoCDCoCDCoCBjbF9tYXBfaXRlbV90IG1n cnBfaXRlbTsKPiArIMKgIMKgIMKgIHVpbnQzMl90IG51bV9vZl9tY207Cj4gKyDCoCDCoCDCoCB1 aW50OF90IGlzX21jX21lbWJlcjsKPiDCoH0gb3NtX3N3aXRjaF90Owo+IMKgLyoKPiDCoCogRklF TERTCj4gQEAgLTE1MSw2ICsxNTQsMTUgQEAgdHlwZWRlZiBzdHJ1Y3Qgb3NtX3N3aXRjaCB7Cj4g wqAqIMKgIMKgIMKgIMKgIMKgIMKgIMKgV2hlbiBzZXQgaW5kaWNhdGVzIHRoYXQgc3dpdGNoIHdh cyBwcm9iYWJseSByZXNldCwgc28KPiDCoCogwqAgwqAgwqAgwqAgwqAgwqAgwqBmd2QgdGFibGVz IGFuZCByZXN0IGNhY2hlZCBkYXRhIHNob3VsZCBiZSBmbHVzaGVkCj4gwqAqCj4gKyogwqAgwqAg wqBtZ3JwX2l0ZW0KPiArKiDCoCDCoCDCoCDCoCDCoCDCoCDCoG1hcCBpdGVtIGZvciBzd2l0Y2gg aW4gYnVpbGRpbmcgbWNhc3QgdHJlZQo+ICsqCj4gKyogwqAgwqAgwqBudW1fb2ZfbWNtCj4gKyog wqAgwqAgwqAgwqAgwqAgwqAgwqBudW1iZXIgb2YgbWNhc3QgbWVtYmVycyhwb3J0cykgY29ubmVj dGVkIHRvIHN3aXRjaAo+ICsqCj4gKyogwqAgwqAgwqBpc19tY19tZW1iZXIKPiArKiDCoCDCoCDC oCDCoCDCoCDCoCDCoHdoZXRoZXIgc3dpdGNoIGlzIGEgbWNhc3QgbWVtYmVyIGl0c2VsZgo+ICsq Cj4gwqAqIFNFRSBBTFNPCj4gwqAqIMKgIMKgIMKgU3dpdGNoIG9iamVjdAo+IMKgKioqKioqKioq Lwo+IGRpZmYgLS1naXQgYS9vcGVuc20vb3BlbnNtL29zbV9tY2FzdF9tZ3IuYyBiL29wZW5zbS9v cGVuc20vb3NtX21jYXN0X21nci5jCj4gaW5kZXggZGNlOWYyYi4uYjUwZjM2MCAxMDA2NDQKPiAt LS0gYS9vcGVuc20vb3BlbnNtL29zbV9tY2FzdF9tZ3IuYwo+ICsrKyBiL29wZW5zbS9vcGVuc20v b3NtX21jYXN0X21nci5jCj4gQEAgLTE1Nyw1MCArMTU3LDExOSBAQCBzdGF0aWMgdm9pZCBtY2Fz dF9tZ3JfcHVyZ2VfdHJlZShvc21fc21fdCAqIHNtLCBJTiBvc21fbWdycF9ib3hfdCAqIG1ib3gp Cj4gwqAgwqAgwqAgwqBPU01fTE9HX0VYSVQoc20tPnBfbG9nKTsKPiDCoH0KPgo+IC1zdGF0aWMg ZmxvYXQgb3NtX21jYXN0X21ncl9jb21wdXRlX2F2Z19ob3BzKG9zbV9zbV90ICogc20sIGNsX3Fs aXN0X3QgKiBsLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgY29uc3Qgb3NtX3N3aXRjaF90ICogcF9zdykKPiArc3RhdGlj IHZvaWQgbWNhc3RfbWdyX2J1aWxkX3N3aXRjaF9tYXAob3NtX3NtX3QgKiBzbSwKPiArIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY29uc3Qg Y2xfcWxpc3RfdCAqIHBvcnRfbGlzdCwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2xfcW1hcF90ICogcF9tY2FzdF9tZW1iZXJfc3df dGJsKQo+IMKgewo+IC0gwqAgwqAgwqAgZmxvYXQgYXZnX2hvcHMgPSAwOwo+IC0gwqAgwqAgwqAg dWludDMyX3QgaG9wcyA9IDA7Cj4gLSDCoCDCoCDCoCB1aW50MzJfdCBudW1fcG9ydHMgPSAwOwo+ IC0gwqAgwqAgwqAgY2xfbGlzdF9pdGVtX3QgKmk7Cj4gKyDCoCDCoCDCoCBvc21fc3dpdGNoX3Qg KnJlbW90ZV9zdzsKPiArIMKgIMKgIMKgIGNsX2xpc3RfaXRlbV90ICpsaXN0X2l0ZW07Cj4gKyDC oCDCoCDCoCBvc21fcG9ydF90ICpwX3BvcnQ7Cj4gKyDCoCDCoCDCoCBpYl9uZXQ2NF90IHBvcnRf Z3VpZDsKPiArIMKgIMKgIMKgIG9zbV9waHlzcF90ICpwX3BoeXNwX3JlbW90ZTsKPiArIMKgIMKg IMKgIG9zbV9ub2RlX3QgKnJlbW90ZV9ub2RlOwo+IMKgIMKgIMKgIMKgb3NtX21jYXN0X3dvcmtf b2JqX3QgKndvYmo7Cj4KPiDCoCDCoCDCoCDCoE9TTV9MT0dfRU5URVIoc20tPnBfbG9nKTsKPgo+ IC0gwqAgwqAgwqAgLyoKPiAtIMKgIMKgIMKgIMKgIMKgRm9yIGVhY2ggbWVtYmVyIG9mIHRoZSBt dWx0aWNhc3QgZ3JvdXAsIGNvbXB1dGUgdGhlCj4gLSDCoCDCoCDCoCDCoCDCoG51bWJlciBvZiBo b3BzIHRvIGl0cyBiYXNlIExJRC4KPiAtIMKgIMKgIMKgIMKgKi8KPiAtIMKgIMKgIMKgIGZvciAo aSA9IGNsX3FsaXN0X2hlYWQobCk7IGkgIT0gY2xfcWxpc3RfZW5kKGwpOyBpID0gY2xfcWxpc3Rf bmV4dChpKSkgewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgd29iaiA9IGNsX2l0ZW1fb2JqKGks IHdvYmosIGxpc3RfaXRlbSk7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBob3BzICs9IG9zbV9z d2l0Y2hfZ2V0X3BvcnRfbGVhc3RfaG9wcyhwX3N3LCB3b2JqLT5wX3BvcnQpOwo+IC0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgbnVtX3BvcnRzKys7Cj4gKyDCoCDCoCDCoCBjbF9xbWFwX2luaXQocF9t Y2FzdF9tZW1iZXJfc3dfdGJsKTsKPiArIMKgIMKgIMKgIGZvciAobGlzdF9pdGVtID0gY2xfcWxp c3RfaGVhZChwb3J0X2xpc3QpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqBsaXN0X2l0ZW0gIT0gY2xf cWxpc3RfZW5kKHBvcnRfbGlzdCk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoGxpc3RfaXRlbSA9IGNs X3FsaXN0X25leHQobGlzdF9pdGVtKSkgewo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgd29iaiA9 IGNsX2l0ZW1fb2JqKGxpc3RfaXRlbSwgd29iaiwgbGlzdF9pdGVtKTsKPiArIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHBfcG9ydCA9IHdvYmotPnBfcG9ydDsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKg IGlmICghcF9wb3J0KQo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY29udGlu dWU7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAocF9wb3J0LT5wX25vZGUtPnN3KSB7Cj4g KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKiBmb3Igc3dpdGNoZXMgLSByZW1v dGUgc3dpdGNoIHdvdWxkIGJlIHRoZSBzd2l0Y2ggaXRzZWxmICovCj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCByZW1vdGVfbm9kZSA9IG9zbV9waHlzcF9nZXRfbm9kZV9wdHIo cF9wb3J0LT5wX3BoeXNwKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH0gZWxzZSB7Cj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwX3BoeXNwX3JlbW90ZSA9IG9zbV9waHlz cF9nZXRfcmVtb3RlKHBfcG9ydC0+cF9waHlzcCk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCByZW1vdGVfbm9kZSA9IG9zbV9waHlzcF9nZXRfbm9kZV9wdHIocF9waHlzcF9y ZW1vdGUpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfQo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgLyogZ2V0IHRoZSByZW1vdGUgc3dpdGNoIG9mIHRoZSBtY21lbWJlciAqLwo+ICsgwqAgwqAg wqAgwqAgwqAgwqAgwqAgcmVtb3RlX3N3ID0gcmVtb3RlX25vZGUtPnN3Owo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgcG9ydF9ndWlkID0gb3NtX25vZGVfZ2V0X25vZGVfZ3VpZChyZW1vdGVfbm9k ZSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAoY2xfcW1hcF9nZXQocF9tY2FzdF9tZW1i ZXJfc3dfdGJsLCBwb3J0X2d1aWQpID09Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBjbF9xbWFwX2VuZChwX21jYXN0X21lbWJlcl9zd190YmwpKSB7Cj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKiBpbnNlcnQgc3dpdGNoIHRvIHRh YmxlICovCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBj bF9xbWFwX2luc2VydChwX21jYXN0X21lbWJlcl9zd190YmwsIHBvcnRfZ3VpZCwgJnJlbW90ZV9z dy0+bWdycF9pdGVtKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIC8qIE5ldyBlbGVtZW50IGluIHRoZSB0YWJsZSAqLwo+ICsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKHBfcG9ydC0+cF9ub2RlLT5zdykKPiAr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IC8qIHRoZSBzd2l0Y2ggaXMgTUMgbWVtZWJlciAqLwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmVtb3RlX3N3LT5pc19tY19tZW1i ZXIgPSAxOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg ZWxzZQo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgLyogZm9yIG90aGVycyAtIHVwZGF0ZSBNQyBjb3VudCAqLwo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmVtb3RlX3N3 LT5udW1fb2ZfbWNtKys7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9Cj4gwqAgwqAgwqAgwqB9 Cj4gKyDCoCDCoCDCoCBPU01fTE9HX0VYSVQoc20tPnBfbG9nKTsKPiArfQo+Cj4gLSDCoCDCoCDC oCAvKgo+IC0gwqAgwqAgwqAgwqAgwqBXZSBzaG91bGQgYmUgaGVyZSBpZiB0aGVyZSBhcmVuJ3Qg YW55IHBvcnRzIGluIHRoZSBncm91cC4KPiAtIMKgIMKgIMKgIMKgKi8KPiAtIMKgIMKgIMKgIENM X0FTU0VSVChudW1fcG9ydHMpOwoKV2hhdCBhYm91dCB3ZWxsIGtub3duIGdyb3VwcyB3aXRoIG5v IGN1cnJlbnQgbWVtYmVycyA/IERvIHRob3NlIGdyb3Vwcwpub3QgZ2V0IGhlcmUgb3IgZG8gdGhl eSBoYXZlIGEgcG9ydCA/CgotLSBIYWwKCj4gK3N0YXRpYyB2b2lkIG1jYXN0X21ncl9kZXN0cm95 X3N3aXRjaF9tYXAob3NtX3NtX3QgKiBzbSwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGNsX3FtYXBfdCAqcF9tY2FzdF9tZW1iZXJfc3dfdGJsKQo+ICt7Cj4gKyDCoCDCoCDC oCBjbF9tYXBfaXRlbV90ICpwX2l0ZW07Cj4gKyDCoCDCoCDCoCBvc21fc3dpdGNoX3QgKnBfc3c7 Cj4KPiAtIMKgIMKgIMKgIGlmIChudW1fcG9ydHMgIT0gMCkKPiAtIMKgIMKgIMKgIMKgIMKgIMKg IMKgIGF2Z19ob3BzID0gKGZsb2F0KShob3BzIC8gbnVtX3BvcnRzKTsKPiArIMKgIMKgIMKgIE9T TV9MT0dfRU5URVIoc20tPnBfbG9nKTsKPgo+ICsgwqAgwqAgwqAgcF9pdGVtID0gY2xfcW1hcF9o ZWFkKHBfbWNhc3RfbWVtYmVyX3N3X3RibCk7Cj4gKyDCoCDCoCDCoCB3aGlsZSAocF9pdGVtICE9 IGNsX3FtYXBfZW5kKHBfbWNhc3RfbWVtYmVyX3N3X3RibCkpIHsKPiArIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHBfc3cgPSBQQVJFTlRfU1RSVUNUKHBfaXRlbSwgb3NtX3N3aXRjaF90LCBtZ3JwX2l0 ZW0pOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcF9zdy0+bnVtX29mX21jbSA9IDA7Cj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCBwX3N3LT5pc19tY19tZW1iZXIgPSAwOwo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgcF9pdGVtID0gY2xfcW1hcF9uZXh0KHBfaXRlbSk7Cj4gKyDCoCDCoCDCoCB9 Cj4gKyDCoCDCoCDCoCBjbF9xbWFwX3JlbW92ZV9hbGwocF9tY2FzdF9tZW1iZXJfc3dfdGJsKTsK PiDCoCDCoCDCoCDCoE9TTV9MT0dfRVhJVChzbS0+cF9sb2cpOwo+IC0gwqAgwqAgwqAgcmV0dXJu IGF2Z19ob3BzOwo+IMKgfQo+Cj4gwqAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+IMKgQ2FsY3VsYXRlIHRoZSBt YXhpbWFsICJtaW4gaG9wcyIgZnJvbSB0aGUgZ2l2ZW4gc3dpdGNoIHRvIGFueQo+IMKgb2YgdGhl IGdyb3VwIEhDQXMKPiDCoCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCj4gLXN0YXRpYyBmbG9hdCBvc21fbWNhc3Rf bWdyX2NvbXB1dGVfbWF4X2hvcHMob3NtX3NtX3QgKiBzbSwgY2xfcWxpc3RfdCAqIGwsCj4gLSDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBjb25zdCBvc21fc3dpdGNoX3QgKiBwX3N3KQo+ICsjaWZkZWYgT1NNX1ZFTkRPUl9JTlRG X0FOQUZBCj4gK3N0YXRpYyBmbG9hdCBvc21fbWNhc3RfbWdyX2NvbXB1dGVfYXZnX2hvcHMob3Nt X3NtX3QgKiBzbSwgY2xfcW1hcF90ICogbSwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNvbnN0IG9zbV9zd2l0Y2hfdCAq IHRoaXNfc3cpCj4gwqB7Cj4gLSDCoCDCoCDCoCB1aW50MzJfdCBtYXhfaG9wcyA9IDA7Cj4gKyDC oCDCoCDCoCBmbG9hdCBhdmdfaG9wcyA9IDA7Cj4gwqAgwqAgwqAgwqB1aW50MzJfdCBob3BzID0g MDsKPiAtIMKgIMKgIMKgIGNsX2xpc3RfaXRlbV90ICppOwo+IC0gwqAgwqAgwqAgb3NtX21jYXN0 X3dvcmtfb2JqX3QgKndvYmo7Cj4gKyDCoCDCoCDCoCB1aW50MzJfdCBudW1fcG9ydHMgPSAwOwo+ ICsgwqAgwqAgwqAgdWludDE2X3QgbGlkOwo+ICsgwqAgwqAgwqAgdWludDMyX3QgbGVhc3RfaG9w czsKPiArIMKgIMKgIMKgIGNsX21hcF9pdGVtX3QgKmk7Cj4gKyDCoCDCoCDCoCBvc21fc3dpdGNo X3QgKnN3Owo+ICsKPiArIMKgIMKgIMKgIE9TTV9MT0dfRU5URVIoc20tPnBfbG9nKTsKPiArCj4g KyDCoCDCoCDCoCBmb3IgKGkgPSBjbF9xbWFwX2hlYWQobSk7IGkgIT0gY2xfcW1hcF9lbmQobSk7 IGkgPSBjbF9xbWFwX25leHQoaSkpIHsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN3ID0gY2xf aXRlbV9vYmooaSwgc3csIG1jYXN0X2l0ZW0pOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbGlk ID0gY2xfbnRvaDE2KG9zbV9ub2RlX2dldF9iYXNlX2xpZChzdy0+cF9ub2RlLCAwKSk7Cj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCBsZWFzdF9ob3BzID0gb3NtX3N3aXRjaF9nZXRfbGVhc3RfaG9w cyh0aGlzX3N3LCBsaWQpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogZm9yIGFsbCBob3N0 IHRoYXQgYXJlIE1DIG1lbWJlcnMgYW5kIGF0dGFjaGVkIHRvIHRoZSBzd2l0Y2gsCj4gKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHdlIHNob3VsZCBhZGQgdGhlIChsZWFzdF9ob3BzICsgMSkg KiBudW1iZXJfb2Zfc3VjaF9ob3N0cy4KPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgSWYg c3dpdGNoIGl0c2VsZiBpcyBpbiB0aGUgTUMsIHdlIHNob3VsZCBhZGQgdGhlIGxlYXN0X2hvcHMg b25seSAqLwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaG9wcyArPSAobGVhc3RfaG9wcyArIDEp ICogc3ctPm51bV9vZl9tY20gKwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbGVhc3Rf aG9wcyAqIHN3LT5pc19tY19tZW1iZXI7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBudW1fcG9y dHMgKz0gc3ctPm51bV9vZl9tY20gKyBzdy0+aXNfbWNfbWVtYmVyOwo+ICsgwqAgwqAgwqAgfQo+ ICsKPiArIMKgIMKgIMKgIC8qIFdlIHNob3VsZCBiZSBoZXJlIGlmIHRoZXJlIGFyZW4ndCBhbnkg cG9ydHMgaW4gdGhlIGdyb3VwLiAqLwo+ICsgwqAgwqAgwqAgQ0xfQVNTRVJUKG51bV9wb3J0cyk7 Cj4gKwo+ICsgwqAgwqAgwqAgYXZnX2hvcHMgPSAoZmxvYXQpKGhvcHMgLyBudW1fcG9ydHMpOwo+ ICsKPiArIMKgIMKgIMKgIE9TTV9MT0dfRVhJVChzbS0+cF9sb2cpOwo+ICsgwqAgwqAgwqAgcmV0 dXJuIGF2Z19ob3BzOwo+ICt9Cj4gKyNlbHNlCj4gK3N0YXRpYyBmbG9hdCBvc21fbWNhc3RfbWdy X2NvbXB1dGVfbWF4X2hvcHMob3NtX3NtX3QgKiBzbSwgY2xfcW1hcF90ICogbSwKPiArIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IGNvbnN0IG9zbV9zd2l0Y2hfdCAqIHRoaXNfc3cpCj4gK3sKPiArIMKgIMKgIMKgIHVpbnQzMl90 IG1heF9ob3BzID0gMCwgaG9wczsKPiArIMKgIMKgIMKgIHVpbnQxNl90IGxpZDsKPiArIMKgIMKg IMKgIGNsX21hcF9pdGVtX3QgKmk7Cj4gKyDCoCDCoCDCoCBvc21fc3dpdGNoX3QgKnN3Owo+Cj4g wqAgwqAgwqAgwqBPU01fTE9HX0VOVEVSKHNtLT5wX2xvZyk7Cj4KPiBAQCAtMjA4LDkgKzI3Nywx MSBAQCBzdGF0aWMgZmxvYXQgb3NtX21jYXN0X21ncl9jb21wdXRlX21heF9ob3BzKG9zbV9zbV90 ICogc20sIGNsX3FsaXN0X3QgKiBsLAo+IMKgIMKgIMKgIMKgIMKgIEZvciBlYWNoIG1lbWJlciBv ZiB0aGUgbXVsdGljYXN0IGdyb3VwLCBjb21wdXRlIHRoZQo+IMKgIMKgIMKgIMKgIMKgIG51bWJl ciBvZiBob3BzIHRvIGl0cyBiYXNlIExJRC4KPiDCoCDCoCDCoCDCoCAqLwo+IC0gwqAgwqAgwqAg Zm9yIChpID0gY2xfcWxpc3RfaGVhZChsKTsgaSAhPSBjbF9xbGlzdF9lbmQobCk7IGkgPSBjbF9x bGlzdF9uZXh0KGkpKSB7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCB3b2JqID0gY2xfaXRlbV9v YmooaSwgd29iaiwgbGlzdF9pdGVtKTsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGhvcHMgPSBv c21fc3dpdGNoX2dldF9wb3J0X2xlYXN0X2hvcHMocF9zdywgd29iai0+cF9wb3J0KTsKPiArIMKg IMKgIMKgIGZvciAoaSA9IGNsX3FtYXBfaGVhZChtKTsgaSAhPSBjbF9xbWFwX2VuZChtKTsgaSA9 IGNsX3FtYXBfbmV4dChpKSkgewo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3cgPSBjbF9pdGVt X29iaihpLCBzdywgbWdycF9pdGVtKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGxpZCA9IGNs X250b2gxNihvc21fbm9kZV9nZXRfYmFzZV9saWQoc3ctPnBfbm9kZSwgMCkpOwo+ICsgwqAgwqAg wqAgwqAgwqAgwqAgwqAgaG9wcyA9IG9zbV9zd2l0Y2hfZ2V0X2xlYXN0X2hvcHModGhpc19zdywg bGlkKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGhvcHMgPSAoaG9wcyArIDEpICogc3ctPm51 bV9vZl9tY20gKyBob3BzICogc3ctPmlzX21jX21lbWJlcjsKPiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmIChob3BzID4gbWF4X2hvcHMpCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBtYXhfaG9wcyA9IGhvcHM7Cj4gwqAgwqAgwqAgwqB9Cj4gQEAgLTIyMiw2ICsyOTMsNyBA QCBzdGF0aWMgZmxvYXQgb3NtX21jYXN0X21ncl9jb21wdXRlX21heF9ob3BzKG9zbV9zbV90ICog c20sIGNsX3FsaXN0X3QgKiBsLAo+IMKgIMKgIMKgIMKgT1NNX0xPR19FWElUKHNtLT5wX2xvZyk7 Cj4gwqAgwqAgwqAgwqByZXR1cm4gKGZsb2F0KW1heF9ob3BzOwo+IMKgfQo+ICsjZW5kaWYKPgo+ IMKgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKPiDCoCDCoFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gbG9jYXRl IHRoZSBvcHRpbWFsIHN3aXRjaCBmb3IgdGhlCj4gQEAgLTIzMCwzMiArMzAyLDMwIEBAIHN0YXRp YyBmbG9hdCBvc21fbWNhc3RfbWdyX2NvbXB1dGVfbWF4X2hvcHMob3NtX3NtX3QgKiBzbSwgY2xf cWxpc3RfdCAqIGwsCj4gwqAgwqBvZiB0aGUgbXVsdGljYXN0IGdyb3VwLgo+IMKgKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KPiDCoHN0YXRpYyBvc21fc3dpdGNoX3QgKm1jYXN0X21ncl9maW5kX29wdGltYWxfc3dp dGNoKG9zbV9zbV90ICogc20sCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNsX3FsaXN0X3QgKmxpc3Qp Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNsX3FsaXN0X3QgKiBsaXN0KQo+IMKgewo+ICsgwqAgwqAg wqAgY2xfcW1hcF90IG1ncnBfc3dfbWFwOwo+IMKgIMKgIMKgIMKgY2xfcW1hcF90ICpwX3N3X3Ri bDsKPiDCoCDCoCDCoCDCoG9zbV9zd2l0Y2hfdCAqcF9zdywgKnBfYmVzdF9zdyA9IE5VTEw7Cj4g wqAgwqAgwqAgwqBmbG9hdCBob3BzID0gMDsKPiDCoCDCoCDCoCDCoGZsb2F0IGJlc3RfaG9wcyA9 IDEwMDAwOyDCoCDCoCDCoCDCoC8qIGFueSBiaWcgIyB3aWxsIGRvICovCj4gLSNpZmRlZiBPU01f VkVORE9SX0lOVEZfQU5BRkEKPiAtIMKgIMKgIMKgIGJvb2xlYW5fdCB1c2VfYXZnX2hvcHMgPSBU UlVFOyDCoC8qIGFuYWZhMiAtIGJ1ZyBoY2Egb24gc3dpdGNoICovLyogdXNlIG1heCBob3BzIGZv ciByb290ICovCj4gLSNlbHNlCj4gLSDCoCDCoCDCoCBib29sZWFuX3QgdXNlX2F2Z19ob3BzID0g RkFMU0U7IC8qIHVzZSBtYXggaG9wcyBmb3Igcm9vdCAqLwo+IC0jZW5kaWYKPgo+IMKgIMKgIMKg IMKgT1NNX0xPR19FTlRFUihzbS0+cF9sb2cpOwo+Cj4gwqAgwqAgwqAgwqBwX3N3X3RibCA9ICZz bS0+cF9zdWJuLT5zd19ndWlkX3RibDsKPgo+ICsgwqAgwqAgwqAgbWNhc3RfbWdyX2J1aWxkX3N3 aXRjaF9tYXAoc20sIGxpc3QsICZtZ3JwX3N3X21hcCk7Cj4gwqAgwqAgwqAgwqBmb3IgKHBfc3cg PSAob3NtX3N3aXRjaF90ICopIGNsX3FtYXBfaGVhZChwX3N3X3RibCk7Cj4gwqAgwqAgwqAgwqAg wqAgwqAgcF9zdyAhPSAob3NtX3N3aXRjaF90ICopIGNsX3FtYXBfZW5kKHBfc3dfdGJsKTsKPiDC oCDCoCDCoCDCoCDCoCDCoCBwX3N3ID0gKG9zbV9zd2l0Y2hfdCAqKSBjbF9xbWFwX25leHQoJnBf c3ctPm1hcF9pdGVtKSkgewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKCFvc21fc3dpdGNo X3N1cHBvcnRzX21jYXN0KHBfc3cpKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgY29udGludWU7Cj4KPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmICh1c2VfYXZnX2hvcHMp Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBob3BzID0gb3NtX21jYXN0X21n cl9jb21wdXRlX2F2Z19ob3BzKHNtLCBsaXN0LCBwX3N3KTsKPiAtIMKgIMKgIMKgIMKgIMKgIMKg IMKgIGVsc2UKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGhvcHMgPSBvc21f bWNhc3RfbWdyX2NvbXB1dGVfbWF4X2hvcHMoc20sIGxpc3QsIHBfc3cpOwo+ICsjaWZkZWYgT1NN X1ZFTkRPUl9JTlRGX0FOQUZBCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBob3BzID0gb3NtX21j YXN0X21ncl9jb21wdXRlX2F2Z19ob3BzKHNtLCAmbWdycF9zd19tYXAsIHBfc3cpOwo+ICsjZWxz ZQo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaG9wcyA9IG9zbV9tY2FzdF9tZ3JfY29tcHV0ZV9t YXhfaG9wcyhzbSwgJm1ncnBfc3dfbWFwLCBwX3N3KTsKPiArI2VuZGlmCj4KPiDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoE9TTV9MT0coc20tPnBfbG9nLCBPU01fTE9HX0RFQlVHLAo+IMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIlN3aXRjaCAweCUwMTYiIFBSSXg2NCAiLCBob3Bz ID0gJWZcbiIsCj4gQEAgLTI3Niw2ICszNDYsNyBAQCBzdGF0aWMgb3NtX3N3aXRjaF90ICptY2Fz dF9tZ3JfZmluZF9vcHRpbWFsX3N3aXRjaChvc21fc21fdCAqIHNtLAo+IMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgT1NNX0xPRyhzbS0+cF9sb2csIE9TTV9MT0dfVkVSQk9TRSwKPiDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCJObyBtdWx0aWNhc3QgY2FwYWJsZSBzd2l0Y2hlcyBk ZXRlY3RlZFxuIik7Cj4KPiArIMKgIMKgIMKgIG1jYXN0X21ncl9kZXN0cm95X3N3aXRjaF9tYXAo c20sICZtZ3JwX3N3X21hcCk7Cj4gwqAgwqAgwqAgwqBPU01fTE9HX0VYSVQoc20tPnBfbG9nKTsK PiDCoCDCoCDCoCDCoHJldHVybiBwX2Jlc3Rfc3c7Cj4gwqB9Cj4gLS0KPiAxLjYuNi4xCj4KPgo= --
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
Quoted 3 lines · Hal Rosenstock
What about well known groups with no current members ? Do those groups not get here or do they have a port ?
Empty MC groups don't participate in routing.
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