i40iw: Do not generate CQE for RTR on QP flush
authorMustafa Ismail <mustafa.ismail@intel.com>
Tue, 3 Oct 2017 16:11:47 +0000 (11:11 -0500)
committerDoug Ledford <dledford@redhat.com>
Wed, 4 Oct 2017 19:29:39 +0000 (15:29 -0400)
If RTR WQE is posted and QP is flushed, a CQE is
incorrectly generated for the RTR WQE. Add code
to look for the RTR and not generate a CQE when
QP is flushed.

Fixes: 280cfc4b74e6 ("i40iw: user kernel shared files")
Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com>
Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/i40iw/i40iw_uk.c
drivers/infiniband/hw/i40iw/i40iw_user.h

index 0aadb7a0d1aa85eca8eb5b1c7ba4eed0775fcb6f..42dde5924bb506f64fa35d8894859618972ff0fb 100644 (file)
@@ -821,6 +821,18 @@ static enum i40iw_status_code i40iw_cq_poll_completion(struct i40iw_cq_uk *cq,
                I40IW_RING_SET_TAIL(qp->rq_ring, array_idx + 1);
                pring = &qp->rq_ring;
        } else {
+               if (qp->first_sq_wq) {
+                       qp->first_sq_wq = false;
+                       if (!wqe_idx && (qp->sq_ring.head == qp->sq_ring.tail)) {
+                               I40IW_RING_MOVE_HEAD_NOCHECK(cq->cq_ring);
+                               I40IW_RING_MOVE_TAIL(cq->cq_ring);
+                               set_64bit_val(cq->shadow_area, 0,
+                                             I40IW_RING_GETCURRENT_HEAD(cq->cq_ring));
+                               memset(info, 0, sizeof(struct i40iw_cq_poll_info));
+                               return i40iw_cq_poll_completion(cq, info);
+                       }
+               }
+
                if (info->comp_status != I40IW_COMPL_STATUS_FLUSHED) {
                        info->wr_id = qp->sq_wrtrk_array[wqe_idx].wrid;
                        info->bytes_xfered = qp->sq_wrtrk_array[wqe_idx].wr_len;
@@ -988,6 +1000,7 @@ enum i40iw_status_code i40iw_qp_uk_init(struct i40iw_qp_uk *qp,
        I40IW_RING_MOVE_TAIL(qp->sq_ring);
        I40IW_RING_MOVE_HEAD(qp->initial_ring, ret_code);
        qp->swqe_polarity = 1;
+       qp->first_sq_wq = true;
        qp->swqe_polarity_deferred = 1;
        qp->rwqe_polarity = 0;
 
index 84be6f13b9c5264f27237a0eb6a2810f9d61b0ab..15e8f55983fde1cc7710730c1afcbfdb3d3c7835 100644 (file)
@@ -376,6 +376,7 @@ struct i40iw_qp_uk {
        u8 rwqe_polarity;
        u8 rq_wqe_size;
        u8 rq_wqe_size_multiplier;
+       bool first_sq_wq;
        bool deferred_flag;
 };