Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=57cb61d587e990d556385d367589ff61f6c2c0f2
Commit:     57cb61d587e990d556385d367589ff61f6c2c0f2
Parent:     9faa559c01311281f26544291322252327b65922
Author:     Ralph Campbell <[EMAIL PROTECTED]>
AuthorDate: Thu Sep 20 16:33:44 2007 -0700
Committer:  Roland Dreier <[EMAIL PROTECTED]>
CommitDate: Tue Oct 9 19:59:14 2007 -0700

    IB/core: Fix handling of multicast response failures
    
    I was looking at the code for multicast.c and noticed that
    ib_sa_join_multicast() calls queue_join() which puts the
    request at the front of the group->pending_list.  If this
    is a second request, it seems like it would interfere with
    process_join_error() since group->last_join won't point
    to the member at the head of the pending_list. The sequence
    would thus be:
    
    1. ib_sa_join_multicast()
       puts member1 on head of pending_list and starts work thread
    2. mcast_work_handler()
       calls send_join() which sets group->last_join to member1
    3. ib_sa_join_multicast()
       puts member2 on head of pending_list
    4. join operation for member1 receives failures response from SA.
    5. join_handler() is called with error status
    6. process_join_error() fails to process member1 since
       it doesn't match the first entry in the group->pending_list.
    
    The impact is that the failed join request is tossed.  The second
    request is processed, and after it completes, the original request ends
    up being retried.
    
    This change also results in join requests being processed in FIFO
    order.
    
    Signed-off-by: Ralph Campbell <[EMAIL PROTECTED]>
    Signed-off-by: Sean Hefty <[EMAIL PROTECTED]>
    Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 drivers/infiniband/core/multicast.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/infiniband/core/multicast.c 
b/drivers/infiniband/core/multicast.c
index 15b4c4d..1bc1fe6 100644
--- a/drivers/infiniband/core/multicast.c
+++ b/drivers/infiniband/core/multicast.c
@@ -196,7 +196,7 @@ static void queue_join(struct mcast_member *member)
        unsigned long flags;
 
        spin_lock_irqsave(&group->lock, flags);
-       list_add(&member->list, &group->pending_list);
+       list_add_tail(&member->list, &group->pending_list);
        if (group->state == MCAST_IDLE) {
                group->state = MCAST_BUSY;
                atomic_inc(&group->refcount);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to