***SPAM*** Re: [ofa-general] Re: [PATCH] opensm/osm_multicast.c: bug with joining/leaving mcast group
Hal Rosenstock
hal.rosenstock at gmail.com
Mon Nov 10 11:42:12 PST 2008
On Mon, Nov 10, 2008 at 2:18 PM, Yevgeny Kliteynik
<kliteyn at dev.mellanox.co.il> wrote:
> Hi Sasha,
>
> Sasha Khapyorsky wrote:
>>
>> Hi Yevgeny,
>>
>> On 16:36 Mon 10 Nov , Yevgeny Kliteynik wrote:
>>>
>>> I think there's a bug in the osm_mgrp_add/remove_port functions.
>>> If some mcast group member has JoinState 0x1 (full member),
>>> and then new join from the same port received with JoinState
>>> 0x2 (non member), OpenSM will reduce number of full members
>>> of this group, which eventually might cause group deletion.
>>
>> Right, isn't this how things should work? When full member updates it
>> state to non member the number of full members are reduced, and then
>> last full member leaves the MC group is deleted (o15-0.2-1.9).
>
> I thought so too,
It's true; what you are seeing is the addition of send only non member
(to full member) and not eliminating full member.
>but turns out that it's wrong:
>
> o15-0.1.11: If SA supports UD multicast, then if an endport joins a
> multicast group as specified in o15-0.1.10:, SA shall replace the
> endport's current MCMemberRecord:JoinState component with the logical
> OR of the MCMemberRecord:JoinState component with the endport's current
> MCMemberRecord:JoinState component if the endport had joined this
> multicast group before.
>
> So the full member doesn't update its state to non-member, but rather
> adds additional bit to the JoinState (the non-member).
Right, a port can simultaneously be full member, non member, and send
only non member.
-- Hal
>
> -- Yevgeny
>
>> Sasha
>>
>>> Similar problem (only in logically opposite direction) happens
>>> when port tries to partially leave mcast group.
>>>
>>> This patch should fix it.
>>>
>>> Signed-off-by: Yevgeny Kliteynik <kliteyn at dev.mellanox.co.il>
>>> ---
>>> opensm/opensm/osm_multicast.c | 33 +++++++++++----------------------
>>> 1 files changed, 11 insertions(+), 22 deletions(-)
>>>
>>> diff --git a/opensm/opensm/osm_multicast.c
>>> b/opensm/opensm/osm_multicast.c
>>> index d62d585..350fd22 100644
>>> --- a/opensm/opensm/osm_multicast.c
>>> +++ b/opensm/opensm/osm_multicast.c
>>> @@ -172,17 +172,11 @@ osm_mcm_port_t *osm_mgrp_add_port(IN osm_subn_t
>>> *subn, osm_log_t *log,
>>> p_mgrp->last_change_id++;
>>> }
>>>
>>> - if ((join_state ^ prev_join_state) & IB_JOIN_STATE_FULL) {
>>> - if (join_state & IB_JOIN_STATE_FULL) {
>>> - if (++p_mgrp->full_members == 1) {
>>> - mgrp_send_notice(subn, log, p_mgrp, 66);
>>> - p_mgrp->to_be_deleted = 0;
>>> - }
>>> - } else if (--p_mgrp->full_members == 0) {
>>> - mgrp_send_notice(subn, log, p_mgrp, 67);
>>> - if (!p_mgrp->well_known)
>>> - p_mgrp->to_be_deleted = 1;
>>> - }
>>> + if ((join_state & IB_JOIN_STATE_FULL) &&
>>> + !(prev_join_state & IB_JOIN_STATE_FULL) &&
>>> + (++p_mgrp->full_members == 1)) {
>>> + mgrp_send_notice(subn, log, p_mgrp, 66);
>>> + p_mgrp->to_be_deleted = 0;
>>> }
>>>
>>> return (p_mcm_port);
>>> @@ -224,17 +218,12 @@ int osm_mgrp_remove_port(osm_subn_t *subn,
>>> osm_log_t *log, osm_mgrp_t *mgrp,
>>>
>>> /* no more full members so the group will be deleted after
>>> re-route
>>> but only if it is not a well known group */
>>> - if ((port_join_state ^ new_join_state) & IB_JOIN_STATE_FULL) {
>>> - if (port_join_state & IB_JOIN_STATE_FULL) {
>>> - if (--mgrp->full_members == 0) {
>>> - mgrp_send_notice(subn, log, mgrp, 67);
>>> - if (!mgrp->well_known)
>>> - mgrp->to_be_deleted = 1;
>>> - }
>>> - } else if (++mgrp->full_members == 1) {
>>> - mgrp_send_notice(subn, log, mgrp, 66);
>>> - mgrp->to_be_deleted = 0;
>>> - }
>>> + if ((port_join_state & IB_JOIN_STATE_FULL) &&
>>> + !(new_join_state & IB_JOIN_STATE_FULL) &&
>>> + (--mgrp->full_members == 0)) {
>>> + mgrp_send_notice(subn, log, mgrp, 67);
>>> + if (!mgrp->well_known)
>>> + mgrp->to_be_deleted = 1;
>>> }
>>>
>>> return ret;
>>> --
>>> 1.5.1.4
>>>
>>
>
> _______________________________________________
> general mailing list
> general at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
>
> To unsubscribe, please visit
> http://openib.org/mailman/listinfo/openib-general
>
More information about the general
mailing list