RDMA/i40iw: Fix for checking if the QP is destroyed
authorTatyana Nikolova <Tatyana.E.Nikolova@intel.com>
Fri, 22 Apr 2016 19:14:28 +0000 (14:14 -0500)
committerDoug Ledford <dledford@redhat.com>
Thu, 28 Apr 2016 20:32:55 +0000 (16:32 -0400)
Fix for checking if the QP associated with a completion
has been destroyed while processing CQ elements.
If that is the case, move the CQ head to the next element
and continue completion processing.

Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova@intel.com>
Signed-off-by: Faisal Latif <faisal.latif@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/i40iw/i40iw_status.h
drivers/infiniband/hw/i40iw/i40iw_uk.c
drivers/infiniband/hw/i40iw/i40iw_verbs.c

index b0110c15e04483b72faf9f9e8d5efa9303851b8f..91c421762f06797be844f0834d7ff09ff36bb5f9 100644 (file)
@@ -95,6 +95,7 @@ enum i40iw_status_code {
        I40IW_ERR_INVALID_MAC_ADDR = -65,
        I40IW_ERR_BAD_STAG      = -66,
        I40IW_ERR_CQ_COMPL_ERROR = -67,
+       I40IW_ERR_QUEUE_DESTROYED = -68
 
 };
 #endif
index 2cd9091abd3ede01d818e53b79064fe18045c1cd..e35faea88c134ca777c2914a2dcfaf87afc77a25 100644 (file)
@@ -802,6 +802,10 @@ static enum i40iw_status_code i40iw_cq_poll_completion(struct i40iw_cq_uk *cq,
        info->is_srq = (bool)RS_64(qword3, I40IWCQ_SRQ);
 
        qp = (struct i40iw_qp_uk *)(unsigned long)comp_ctx;
+       if (!qp) {
+               ret_code = I40IW_ERR_QUEUE_DESTROYED;
+               goto exit;
+       }
        wqe_idx = (u32)RS_64(qword3, I40IW_CQ_WQEIDX);
        info->qp_handle = (i40iw_qp_handle)(unsigned long)qp;
 
@@ -859,6 +863,7 @@ static enum i40iw_status_code i40iw_cq_poll_completion(struct i40iw_cq_uk *cq,
 
        ret_code = 0;
 
+exit:
        if (!ret_code &&
            (info->comp_status == I40IW_COMPL_STATUS_FLUSHED))
                if (pring && (I40IW_RING_MORE_WORK(*pring)))
index 45f70f5e14a782cf368dd192bd25c43e8362962b..eaa79c9fc8217576cce4104e86f2a21ab62d4d76 100644 (file)
@@ -2259,6 +2259,8 @@ static int i40iw_poll_cq(struct ib_cq *ibcq,
                ret = ukcq->ops.iw_cq_poll_completion(ukcq, &cq_poll_info, true);
                if (ret == I40IW_ERR_QUEUE_EMPTY) {
                        break;
+               } else if (ret == I40IW_ERR_QUEUE_DESTROYED) {
+                       continue;
                } else if (ret) {
                        if (!cqe_count)
                                cqe_count = -1;