rxe: fix broken receive queue draining
authorVijay Immanuel <vijayi@attalasystems.com>
Tue, 27 Jun 2017 09:19:38 +0000 (12:19 +0300)
committerDoug Ledford <dledford@redhat.com>
Thu, 20 Jul 2017 15:20:50 +0000 (11:20 -0400)
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 <bart.vanassche@sandisk.com>
Signed-off-by: Vijay Immanuel <vijayi@attalasystems.com>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com>--
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/sw/rxe/rxe_resp.c
drivers/infiniband/sw/rxe/rxe_verbs.c

index be944d5aa9afc1c3d357653275d7c39883d801ec..a958ee918a49f0a8b1e23b63fa20a9d8a4db5e7d 100644 (file)
@@ -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);
 }
index 07511718d98d8cd88da3b5dff46affbc21671c0e..af90a7d42b96abb115d647a919e1080530e01ca4 100644 (file)
@@ -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;
 }