iw_cxgb4: explicitly move the qp to ERROR state during flush
authorSteve Wise <swise@opengridcomputing.com>
Fri, 29 Jul 2016 15:38:46 +0000 (08:38 -0700)
committerDoug Ledford <dledford@redhat.com>
Tue, 2 Aug 2016 17:15:17 +0000 (13:15 -0400)
This forces the connection to abort if the application failed to
disconnect before flushing.  This is aligned with how the common
flush services work.

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/cxgb4/qp.c

index b3441af69573282a62a5cb6d9376b26ad50a8ac9..28a76a5d622735ed22f21f87200c081c6a5313ef 100644 (file)
@@ -1898,12 +1898,20 @@ int c4iw_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
        return 0;
 }
 
+static void move_qp_to_err(struct c4iw_qp *qp)
+{
+       struct c4iw_qp_attributes attrs = { .next_state = C4IW_QP_STATE_ERROR };
+
+       (void)c4iw_modify_qp(qp->rhp, qp, C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);
+}
+
 void c4iw_drain_sq(struct ib_qp *ibqp)
 {
        struct c4iw_qp *qp = to_c4iw_qp(ibqp);
        unsigned long flag;
        bool need_to_wait;
 
+       move_qp_to_err(qp);
        spin_lock_irqsave(&qp->lock, flag);
        need_to_wait = !t4_sq_empty(&qp->wq);
        spin_unlock_irqrestore(&qp->lock, flag);
@@ -1918,6 +1926,7 @@ void c4iw_drain_rq(struct ib_qp *ibqp)
        unsigned long flag;
        bool need_to_wait;
 
+       move_qp_to_err(qp);
        spin_lock_irqsave(&qp->lock, flag);
        need_to_wait = !t4_rq_empty(&qp->wq);
        spin_unlock_irqrestore(&qp->lock, flag);