aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVijay Immanuel <[email protected]>2017-06-27 12:19:38 +0300
committerDoug Ledford <[email protected]>2017-07-20 11:20:50 -0400
commit1217197142d1681a8b8aaa88cdf4b245b76974cd (patch)
tree54b814d43b57f593b3a6946e10495b6e382b5d05
parentc75d3ec8c0ee469de79ae83c1a827d753603e49f (diff)
rxe: fix broken receive queue draining
If we modified the qp to ERROR state, and drained the recieve queue, post_recv must trigger the responder task to complete the drain work request. Cc: Bart Van Assche <[email protected]> Signed-off-by: Vijay Immanuel <[email protected]> Signed-off-by: Sagi Grimberg <[email protected]> Reviewed-by: Bart Van Assche <[email protected]>-- Signed-off-by: Doug Ledford <[email protected]>
-rw-r--r--drivers/infiniband/sw/rxe/rxe_resp.c3
-rw-r--r--drivers/infiniband/sw/rxe/rxe_verbs.c3
2 files changed, 6 insertions, 0 deletions
diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
index be944d5aa9af..a958ee918a49 100644
--- a/drivers/infiniband/sw/rxe/rxe_resp.c
+++ b/drivers/infiniband/sw/rxe/rxe_resp.c
@@ -1219,6 +1219,9 @@ void rxe_drain_req_pkts(struct rxe_qp *qp, bool notify)
kfree_skb(skb);
}
+ if (notify)
+ return;
+
while (!qp->srq && qp->rq.queue && queue_head(qp->rq.queue))
advance_consumer(qp->rq.queue);
}
diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/rxe/rxe_verbs.c
index 07511718d98d..af90a7d42b96 100644
--- a/drivers/infiniband/sw/rxe/rxe_verbs.c
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.c
@@ -914,6 +914,9 @@ static int rxe_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
spin_unlock_irqrestore(&rq->producer_lock, flags);
+ if (qp->resp.state == QP_STATE_ERROR)
+ rxe_run_task(&qp->resp.task, 1);
+
err1:
return err;
}