OSDN Git Service

RDMA/bnxt_re: synchronize poll_cq and req_notify_cq verbs
authorSelvin Xavier <selvin.xavier@broadcom.com>
Mon, 6 Nov 2017 16:07:32 +0000 (08:07 -0800)
committerDoug Ledford <dledford@redhat.com>
Mon, 13 Nov 2017 20:53:57 +0000 (15:53 -0500)
Synchronize poll_cq and req_notify_cq verbs using cq_lock,
instead of the lower level qplib->hwq.lock.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/bnxt_re/ib_verbs.c

index c29f33a..526ab3f 100644 (file)
@@ -2996,8 +2996,10 @@ int bnxt_re_req_notify_cq(struct ib_cq *ib_cq,
                          enum ib_cq_notify_flags ib_cqn_flags)
 {
        struct bnxt_re_cq *cq = container_of(ib_cq, struct bnxt_re_cq, ib_cq);
-       int type = 0;
+       int type = 0, rc = 0;
+       unsigned long flags;
 
+       spin_lock_irqsave(&cq->cq_lock, flags);
        /* Trigger on the very next completion */
        if (ib_cqn_flags & IB_CQ_NEXT_COMP)
                type = DBR_DBR_TYPE_CQ_ARMALL;
@@ -3007,12 +3009,15 @@ int bnxt_re_req_notify_cq(struct ib_cq *ib_cq,
 
        /* Poll to see if there are missed events */
        if ((ib_cqn_flags & IB_CQ_REPORT_MISSED_EVENTS) &&
-           !(bnxt_qplib_is_cq_empty(&cq->qplib_cq)))
-               return 1;
-
+           !(bnxt_qplib_is_cq_empty(&cq->qplib_cq))) {
+               rc = 1;
+               goto exit;
+       }
        bnxt_qplib_req_notify_cq(&cq->qplib_cq, type);
 
-       return 0;
+exit:
+       spin_unlock_irqrestore(&cq->cq_lock, flags);
+       return rc;
 }
 
 /* Memory Regions */