From 38c68a7ecf914fc7669cdadf9c3b8bae4500a20b Mon Sep 17 00:00:00 2001 From: Mike Marciniszyn Date: Mon, 10 Jan 2011 17:42:22 -0800 Subject: [PATCH] --- yaml --- r: 229279 b: refs/heads/master c: dd04e43d46ad7a4e625a9ff3b270dc0db9abe81d h: refs/heads/master i: 229277: 812a8efb5f25d413738a0115ccfaa29b51ce82c6 229275: eed471a0b8f218dcc7afc957b0a09181ab9df60f 229271: aa42c28bb30cbf421eb5479cc5590d5783281555 229263: 0ae106e332276bdcdbfe84b691905985f1828f8c 229247: 2f5525b1f26a63f8067a755352c59e971ed9de9b v: v3 --- [refs] | 2 +- trunk/drivers/infiniband/hw/qib/qib_rc.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index bf3051be2251..b335897f7ca0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 994bcd28a36af1413381dfe0aac065e2cbc2af40 +refs/heads/master: dd04e43d46ad7a4e625a9ff3b270dc0db9abe81d diff --git a/trunk/drivers/infiniband/hw/qib/qib_rc.c b/trunk/drivers/infiniband/hw/qib/qib_rc.c index 955fb7157793..8245237b67ce 100644 --- a/trunk/drivers/infiniband/hw/qib/qib_rc.c +++ b/trunk/drivers/infiniband/hw/qib/qib_rc.c @@ -1407,6 +1407,7 @@ static void qib_rc_rcv_resp(struct qib_ibport *ibp, struct qib_ctxtdata *rcd) { struct qib_swqe *wqe; + struct qib_pportdata *ppd = ppd_from_ibp(ibp); enum ib_wc_status status; unsigned long flags; int diff; @@ -1414,6 +1415,29 @@ static void qib_rc_rcv_resp(struct qib_ibport *ibp, u32 aeth; u64 val; + if (opcode != OP(RDMA_READ_RESPONSE_MIDDLE)) { + /* + * If ACK'd PSN on SDMA busy list try to make progress to + * reclaim SDMA credits. + */ + if ((qib_cmp24(psn, qp->s_sending_psn) >= 0) && + (qib_cmp24(qp->s_sending_psn, qp->s_sending_hpsn) <= 0)) { + + /* + * If send tasklet not running attempt to progress + * SDMA queue. + */ + if (!(qp->s_flags & QIB_S_BUSY)) { + /* Acquire SDMA Lock */ + spin_lock_irqsave(&ppd->sdma_lock, flags); + /* Invoke sdma make progress */ + qib_sdma_make_progress(ppd); + /* Release SDMA Lock */ + spin_unlock_irqrestore(&ppd->sdma_lock, flags); + } + } + } + spin_lock_irqsave(&qp->s_lock, flags); /* Ignore invalid responses. */