diff options
Diffstat (limited to 'drivers/infiniband/core/multicast.c')
| -rw-r--r-- | drivers/infiniband/core/multicast.c | 23 | 
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c index 250937cb9a1a..a83ec28a147b 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);  |