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).

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 <[EMAIL PROTECTED]>
> ---
>  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
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to