Message ID | 1463401694-19247-4-git-send-email-erezsh@mellanox.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
On Mon, May 16, 2016 at 03:28:13PM +0300, Erez Shitrit wrote: > > There are four types for MCG, FullMember, NonMember, SendOnlyNonMember, > and the new added type: SendOnlyFullMember. > Add support for the new SendOnlyFullMember join state. > > The new type allows host to send join request as sendonly, it will cause the > group to be created but without getting packets from this multicast back to the > host. > > Signed-off-by: Erez Shitrit <erezsh@mellanox.com> > Reviewed-by: Leon Romanovsky <leonro@mellanox.com> > Reviewed-by: Christoph Lameter <cl@linux.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> > --- > drivers/infiniband/core/multicast.c | 23 ++++++++++++++++++----- > 1 file changed, 18 insertions(+), 5 deletions(-) > > diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c > index 250937c..a83ec28 100644 > --- a/drivers/infiniband/core/multicast.c > +++ b/drivers/infiniband/core/multicast.c > @@ -93,6 +93,18 @@ enum { > > struct mcast_member; > > +/* > +* There are 4 types of join states: > +* FullMember, NonMember, SendOnlyNonMember, SendOnlyFullMember. > +*/ > +enum { > + FULLMEMBER_JOIN, > + NONMEMBER_JOIN, > + SENDONLY_NONMEBER_JOIN, > + SENDONLY_FULLMEMBER_JOIN, > + NUM_JOIN_MEMBERSHIP_TYPES, > +}; > + > struct mcast_group { > struct ib_sa_mcmember_rec rec; > struct rb_node node; > @@ -102,7 +114,7 @@ struct mcast_group { > struct list_head pending_list; > struct list_head active_list; > struct mcast_member *last_join; > - int members[3]; > + int members[NUM_JOIN_MEMBERSHIP_TYPES]; > atomic_t refcount; > enum mcast_group_state state; > struct ib_sa_query *query; > @@ -220,8 +232,9 @@ static void queue_join(struct mcast_member *member) > } > > /* > - * A multicast group has three types of members: full member, non member, and > - * send only member. We need to keep track of the number of members of each > + * A multicast group has four types of members: full member, non member, > + * sendonly non member and sendonly full member. > + * We need to keep track of the number of members of each > * type based on their join state. Adjust the number of members the belong to > * the specified join states. > */ > @@ -229,7 +242,7 @@ static void adjust_membership(struct mcast_group *group, u8 join_state, int inc) > { > int i; > > - for (i = 0; i < 3; i++, join_state >>= 1) > + for (i = 0; i < NUM_JOIN_MEMBERSHIP_TYPES; i++, join_state >>= 1) > if (join_state & 0x1) > group->members[i] += inc; > } > @@ -245,7 +258,7 @@ static u8 get_leave_state(struct mcast_group *group) > u8 leave_state = 0; > int i; > > - for (i = 0; i < 3; i++) > + for (i = 0; i < NUM_JOIN_MEMBERSHIP_TYPES; i++) > if (!group->members[i]) > leave_state |= (0x1 << i); > > -- > 1.7.11.3 > -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c index 250937c..a83ec28 100644 --- a/drivers/infiniband/core/multicast.c +++ b/drivers/infiniband/core/multicast.c @@ -93,6 +93,18 @@ enum { struct mcast_member; +/* +* There are 4 types of join states: +* FullMember, NonMember, SendOnlyNonMember, SendOnlyFullMember. +*/ +enum { + FULLMEMBER_JOIN, + NONMEMBER_JOIN, + SENDONLY_NONMEBER_JOIN, + SENDONLY_FULLMEMBER_JOIN, + NUM_JOIN_MEMBERSHIP_TYPES, +}; + struct mcast_group { struct ib_sa_mcmember_rec rec; struct rb_node node; @@ -102,7 +114,7 @@ struct mcast_group { struct list_head pending_list; struct list_head active_list; struct mcast_member *last_join; - int members[3]; + int members[NUM_JOIN_MEMBERSHIP_TYPES]; atomic_t refcount; enum mcast_group_state state; struct ib_sa_query *query; @@ -220,8 +232,9 @@ static void queue_join(struct mcast_member *member) } /* - * A multicast group has three types of members: full member, non member, and - * send only member. We need to keep track of the number of members of each + * A multicast group has four types of members: full member, non member, + * sendonly non member and sendonly full member. + * We need to keep track of the number of members of each * type based on their join state. Adjust the number of members the belong to * the specified join states. */ @@ -229,7 +242,7 @@ static void adjust_membership(struct mcast_group *group, u8 join_state, int inc) { int i; - for (i = 0; i < 3; i++, join_state >>= 1) + for (i = 0; i < NUM_JOIN_MEMBERSHIP_TYPES; i++, join_state >>= 1) if (join_state & 0x1) group->members[i] += inc; } @@ -245,7 +258,7 @@ static u8 get_leave_state(struct mcast_group *group) u8 leave_state = 0; int i; - for (i = 0; i < 3; i++) + for (i = 0; i < NUM_JOIN_MEMBERSHIP_TYPES; i++) if (!group->members[i]) leave_state |= (0x1 << i);