aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Boyer <[email protected]>2016-11-23 12:39:18 -0500
committerDoug Ledford <[email protected]>2016-12-12 16:31:45 -0500
commitdd753d87436ce7ef2a958d684b38d5acc99c9f5c (patch)
treebde5eb088fba64caa154cc0e8c3691f9cd38b63f
parent6e9bb530ff8b07b3bbce79c937fc9dcb32da4eb9 (diff)
IB/rxe: Advance the consumer pointer before posting the CQE
A simple userspace application might poll the CQ, find a completion, and then attempt to post a new WQE to the SQ. A spurious error can occur if the userspace application detects a full SQ in the instant before the kernel is able to advance the SQ consumer pointer. This is noticeable when using single-entry SQs with ibv_rc_pingpong if lots of kernel and userspace library debugging is enabled. Signed-off-by: Andrew Boyer <[email protected]> Reviewed-by: Yonatan Cohen <[email protected]> Signed-off-by: Doug Ledford <[email protected]>
-rw-r--r--drivers/infiniband/sw/rxe/rxe_comp.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/infiniband/sw/rxe/rxe_comp.c b/drivers/infiniband/sw/rxe/rxe_comp.c
index 6c5e29db88e3..d46c49b33b13 100644
--- a/drivers/infiniband/sw/rxe/rxe_comp.c
+++ b/drivers/infiniband/sw/rxe/rxe_comp.c
@@ -420,11 +420,12 @@ static void do_complete(struct rxe_qp *qp, struct rxe_send_wqe *wqe)
(wqe->wr.send_flags & IB_SEND_SIGNALED) ||
(qp->req.state == QP_STATE_ERROR)) {
make_send_cqe(qp, wqe, &cqe);
+ advance_consumer(qp->sq.queue);
rxe_cq_post(qp->scq, &cqe, 0);
+ } else {
+ advance_consumer(qp->sq.queue);
}
- advance_consumer(qp->sq.queue);
-
/*
* we completed something so let req run again
* if it is trying to fence