IB/srpt: Post receive work requests after qp transition to INIT state
authorMike Marciniszyn <mike.marciniszyn@intel.com>
Fri, 3 Nov 2017 23:20:52 +0000 (16:20 -0700)
committerDoug Ledford <dledford@redhat.com>
Mon, 13 Nov 2017 20:25:16 +0000 (15:25 -0500)
IB and iWARP specs both spell out that posting a receive work request
to a queue pair in the RESET state is an invalid operation and required
to fail.  Postpone posting receive work requests until after the
transition to the INIT state.

Fixes: commit dea262094cdf ("IB/srpt: Change default behavior from using SRQ to using RC")
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/ulp/srpt/ib_srpt.c

index 304855b..98b1b80 100644 (file)
@@ -1687,10 +1687,6 @@ retry:
                goto err_destroy_cq;
        }
 
-       if (!sdev->use_srq)
-               for (i = 0; i < ch->rq_size; i++)
-                       srpt_post_recv(sdev, ch, ch->ioctx_recv_ring[i]);
-
        atomic_set(&ch->sq_wr_avail, qp_init->cap.max_send_wr);
 
        pr_debug("%s: max_cqe= %d max_sge= %d sq_size = %d cm_id= %p\n",
@@ -1701,6 +1697,10 @@ retry:
        if (ret)
                goto err_destroy_qp;
 
+       if (!sdev->use_srq)
+               for (i = 0; i < ch->rq_size; i++)
+                       srpt_post_recv(sdev, ch, ch->ioctx_recv_ring[i]);
+
 out:
        kfree(qp_init);
        return ret;