Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=7b21d26ddad6912bf345e8e88a51a5ce98a036ad
Commit:     7b21d26ddad6912bf345e8e88a51a5ce98a036ad
Parent:     9f9630d5e12a51f38513de0d64320a55ab6f02d5
Author:     Ralph Campbell <[EMAIL PROTECTED]>
AuthorDate: Thu Mar 15 14:44:50 2007 -0700
Committer:  Roland Dreier <[EMAIL PROTECTED]>
CommitDate: Wed Apr 18 20:20:54 2007 -0700

    IB/ipath: NMI cpu lockup if local loopback used
    
    If a post send is done in loopback and there is no receive queue
    entry, the sending QP is put on a timeout list for a while so the
    receiver has a chance to post a receive buffer. If the another post
    send is done, the code incorrectly tried to put the QP on the timeout
    list again an corrupted the timeout list. This eventually leads to a
    spin lock deadlock NMI due to the timer function looping forever with
    the lock held.
    
    Signed-off-by: Bryan O'Sullivan <[EMAIL PROTECTED]>
    Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 drivers/infiniband/hw/ipath/ipath_ruc.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/infiniband/hw/ipath/ipath_ruc.c 
b/drivers/infiniband/hw/ipath/ipath_ruc.c
index 146db85..cda8493 100644
--- a/drivers/infiniband/hw/ipath/ipath_ruc.c
+++ b/drivers/infiniband/hw/ipath/ipath_ruc.c
@@ -265,7 +265,8 @@ static void ipath_ruc_loopback(struct ipath_qp *sqp)
 again:
        spin_lock_irqsave(&sqp->s_lock, flags);
 
-       if (!(ib_ipath_state_ops[sqp->state] & IPATH_PROCESS_SEND_OK)) {
+       if (!(ib_ipath_state_ops[sqp->state] & IPATH_PROCESS_SEND_OK) ||
+           qp->s_rnr_timeout) {
                spin_unlock_irqrestore(&sqp->s_lock, flags);
                goto done;
        }
-
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