RDMA/ocrdma: Check resource ids received in Async CQE
authorNaga Irrinki <Naga.Irrinki@avagotech.com>
Tue, 20 Oct 2015 08:47:58 +0000 (14:17 +0530)
committerDoug Ledford <dledford@redhat.com>
Wed, 21 Oct 2015 21:28:19 +0000 (17:28 -0400)
Some versions of the FW sends wrong QP or CQ IDs in the
Async CQE. Adding a check to see whether qp or cq structures
associated with the CQE is valid.

Signed-off-by: Devesh Sharma <devesh.sharma@avagotech.com>
Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/ocrdma/ocrdma_hw.c

index aab391a15db429104f52765346455ba07efa424b..9d99142998667658c22a883083d188e216dc9c27 100644 (file)
@@ -678,11 +678,33 @@ static void ocrdma_dispatch_ibevent(struct ocrdma_dev *dev,
        int dev_event = 0;
        int type = (cqe->valid_ae_event & OCRDMA_AE_MCQE_EVENT_TYPE_MASK) >>
            OCRDMA_AE_MCQE_EVENT_TYPE_SHIFT;
+       u16 qpid = cqe->qpvalid_qpid & OCRDMA_AE_MCQE_QPID_MASK;
+       u16 cqid = cqe->cqvalid_cqid & OCRDMA_AE_MCQE_CQID_MASK;
 
-       if (cqe->qpvalid_qpid & OCRDMA_AE_MCQE_QPVALID)
-               qp = dev->qp_tbl[cqe->qpvalid_qpid & OCRDMA_AE_MCQE_QPID_MASK];
-       if (cqe->cqvalid_cqid & OCRDMA_AE_MCQE_CQVALID)
-               cq = dev->cq_tbl[cqe->cqvalid_cqid & OCRDMA_AE_MCQE_CQID_MASK];
+       /*
+        * Some FW version returns wrong qp or cq ids in CQEs.
+        * Checking whether the IDs are valid
+        */
+
+       if (cqe->qpvalid_qpid & OCRDMA_AE_MCQE_QPVALID) {
+               if (qpid < dev->attr.max_qp)
+                       qp = dev->qp_tbl[qpid];
+               if (qp == NULL) {
+                       pr_err("ocrdma%d:Async event - qpid %u is not valid\n",
+                              dev->id, qpid);
+                       return;
+               }
+       }
+
+       if (cqe->cqvalid_cqid & OCRDMA_AE_MCQE_CQVALID) {
+               if (cqid < dev->attr.max_cq)
+                       cq = dev->cq_tbl[cqid];
+               if (cq == NULL) {
+                       pr_err("ocrdma%d:Async event - cqid %u is not valid\n",
+                              dev->id, cqid);
+                       return;
+               }
+       }
 
        memset(&ib_evt, 0, sizeof(ib_evt));