[openib-general] Re: [RFC] [PATCH 1/2] multicast support for	multiple users
    Roland Dreier 
    rdreier at cisco.com
       
    Thu Apr  6 13:03:06 PDT 2006
    
    
  
 > +static void queue_join(struct mcast_member *member)
 > +{
 > +	struct mcast_group *group = member->group;
 > +	unsigned long flags;
 > +
 > +	spin_lock_irqsave(&group->lock, flags);
 > +	list_add(&member->list, &group->pending_list);
 > +	if (group->state == MCAST_IDLE) {
 > +		group->state = MCAST_BUSY;
 > +		spin_unlock_irqrestore(&group->lock, flags);
 > +		atomic_inc(&group->refcount);
 > +		queue_work(mcast_wq, &group->work);
 > +	} else
 > +		spin_unlock_irqrestore(&group->lock, flags);
 > +}
should the atomic_inc() be outside the lock here?  It seems that
leaves a window for things to go bad.  It might be simpler to just do
something like:
	spin_lock_irqsave(&group->lock, flags);
	list_add(&member->list, &group->pending_list);
	if (group->state == MCAST_IDLE) {
		group->state = MCAST_BUSY;
		atomic_inc(&group->refcount);
		queue_work(mcast_wq, &group->work);
	}
	spin_unlock_irqrestore(&group->lock, flags);
 > +static void adjust_membership(struct mcast_group *group, u8 join_state, int inc)
 > +{
 > +	int i;
 > +
 > +	for (i = 0; i < 3; i++, join_state >>= 1)
 > +		if (join_state & 0x1)
 > +			group->members[i] += inc;
 > +}
 > +
 > +static u8 get_leave_state(struct mcast_group *group)
 > +{
 > +	u8 leave_state = 0;
 > +	int i;
 > +
 > +	for (i = 0; i < 3; i++)
 > +		if (!group->members[i])
 > +			leave_state |= (0x1 << i);
 > +
 > +	return leave_state & group->rec.join_state;
 > +}
These look rather magical -- perhaps a comment to make them understandable?
 > +	case MCAST_JOINING:
 > +		list_del_init(&member->list);
 > +		break;
Why not just list_del()?  I don't see anywhere that this list_head is
used after this.
    
    
More information about the general
mailing list