RDMA/bnxt_re: Flush CQ notification Work Queue before destroying QP
authorSelvin Xavier <selvin.xavier@broadcom.com>
Mon, 6 Nov 2017 16:07:31 +0000 (08:07 -0800)
committerDoug Ledford <dledford@redhat.com>
Mon, 13 Nov 2017 20:53:57 +0000 (15:53 -0500)
Destroy_qp shall wait for any outstanding CQ notification to be
flushed out before proceeding with QP destroy. Flushing the WQ
before destroying the QP.

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
drivers/infiniband/hw/bnxt_re/qplib_fp.c
drivers/infiniband/hw/bnxt_re/qplib_fp.h

index adc42d7..c29f33a 100644 (file)
@@ -785,6 +785,7 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp)
        struct bnxt_re_dev *rdev = qp->rdev;
        int rc;
 
+       bnxt_qplib_flush_cqn_wq(&qp->qplib_qp);
        bnxt_qplib_del_flush_qp(&qp->qplib_qp);
        rc = bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp);
        if (rc) {
index 805a612..c0f8133 100644 (file)
@@ -2537,3 +2537,10 @@ void bnxt_qplib_req_notify_cq(struct bnxt_qplib_cq *cq, u32 arm_type)
        atomic_set(&cq->arm_state, 1);
        spin_unlock_irqrestore(&cq->hwq.lock, flags);
 }
+
+void bnxt_qplib_flush_cqn_wq(struct bnxt_qplib_qp *qp)
+{
+       flush_workqueue(qp->scq->nq->cqn_wq);
+       if (qp->scq != qp->rcq)
+               flush_workqueue(qp->rcq->nq->cqn_wq);
+}
index 8ead70c..c582d4e 100644 (file)
@@ -478,4 +478,5 @@ void bnxt_qplib_release_cq_locks(struct bnxt_qplib_qp *qp,
 int bnxt_qplib_process_flush_list(struct bnxt_qplib_cq *cq,
                                  struct bnxt_qplib_cqe *cqe,
                                  int num_cqes);
+void bnxt_qplib_flush_cqn_wq(struct bnxt_qplib_qp *qp);
 #endif /* __BNXT_QPLIB_FP_H__ */