i40iw: Do not allow posting WR after QP is flushed
authorShiraz Saleem <shiraz.saleem@intel.com>
Tue, 3 Oct 2017 16:11:48 +0000 (11:11 -0500)
committerDoug Ledford <dledford@redhat.com>
Wed, 4 Oct 2017 19:29:39 +0000 (15:29 -0400)
A Work Request (WR) posted after QP is flushed will not
get a flush completion.

Correct this problem by not allowing posting of WRs
after a QP is flushed.

Fixes: d37498417947 ("i40iw: add files for iwarp interface")
Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/i40iw/i40iw_verbs.c

index 28b3d02d511b35f60c44437c47ed88bb4a04d424..58d815f06e4eaf3702849853088b1d568131aed8 100644 (file)
@@ -2202,6 +2202,12 @@ static int i40iw_post_send(struct ib_qp *ibqp,
        ukqp = &iwqp->sc_qp.qp_uk;
 
        spin_lock_irqsave(&iwqp->lock, flags);
+
+       if (iwqp->flush_issued) {
+               err = -EINVAL;
+               goto out;
+       }
+
        while (ib_wr) {
                inv_stag = false;
                memset(&info, 0, sizeof(info));
@@ -2344,6 +2350,7 @@ static int i40iw_post_send(struct ib_qp *ibqp,
                ib_wr = ib_wr->next;
        }
 
+out:
        if (err)
                *bad_wr = ib_wr;
        else
@@ -2376,6 +2383,12 @@ static int i40iw_post_recv(struct ib_qp *ibqp,
 
        memset(&post_recv, 0, sizeof(post_recv));
        spin_lock_irqsave(&iwqp->lock, flags);
+
+       if (iwqp->flush_issued) {
+               err = -EINVAL;
+               goto out;
+       }
+
        while (ib_wr) {
                post_recv.num_sges = ib_wr->num_sge;
                post_recv.wr_id = ib_wr->wr_id;