Thomas Bogendoerfer 227321
From: Selvin Xavier <selvin.xavier@broadcom.com>
Thomas Bogendoerfer 227321
Date: Mon, 6 Nov 2017 08:07:31 -0800
Thomas Bogendoerfer 227321
Subject: RDMA/bnxt_re: Flush CQ notification Work Queue before destroying QP
Thomas Bogendoerfer 227321
Patch-mainline: v4.15-rc1
Thomas Bogendoerfer 227321
Git-commit: c88a7858d721af5e2d059e3b0b751fed0504e814
Thomas Bogendoerfer 227321
References: bsc#1050244 FATE#322915
Thomas Bogendoerfer 227321
Thomas Bogendoerfer 227321
Destroy_qp shall wait for any outstanding CQ notification to be
Thomas Bogendoerfer 227321
flushed out before proceeding with QP destroy. Flushing the WQ
Thomas Bogendoerfer 227321
before destroying the QP.
Thomas Bogendoerfer 227321
Thomas Bogendoerfer 227321
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Thomas Bogendoerfer 227321
Signed-off-by: Doug Ledford <dledford@redhat.com>
Thomas Bogendoerfer 227321
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 227321
---
Thomas Bogendoerfer 227321
 drivers/infiniband/hw/bnxt_re/ib_verbs.c |    1 +
Thomas Bogendoerfer 227321
 drivers/infiniband/hw/bnxt_re/qplib_fp.c |    7 +++++++
Thomas Bogendoerfer 227321
 drivers/infiniband/hw/bnxt_re/qplib_fp.h |    1 +
Thomas Bogendoerfer 227321
 3 files changed, 9 insertions(+)
Thomas Bogendoerfer 227321
Thomas Bogendoerfer 227321
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
Thomas Bogendoerfer 227321
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
Thomas Bogendoerfer 227321
@@ -797,6 +797,7 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_
Thomas Bogendoerfer 227321
 	struct bnxt_re_dev *rdev = qp->rdev;
Thomas Bogendoerfer 227321
 	int rc;
Thomas Bogendoerfer 227321
 
Thomas Bogendoerfer 227321
+	bnxt_qplib_flush_cqn_wq(&qp->qplib_qp);
Thomas Bogendoerfer 227321
 	bnxt_qplib_del_flush_qp(&qp->qplib_qp);
Thomas Bogendoerfer 227321
 	rc = bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp);
Thomas Bogendoerfer 227321
 	if (rc) {
Thomas Bogendoerfer 227321
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
Thomas Bogendoerfer 227321
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
Thomas Bogendoerfer 227321
@@ -2542,3 +2542,10 @@ void bnxt_qplib_req_notify_cq(struct bnx
Thomas Bogendoerfer 227321
 	atomic_set(&cq->arm_state, 1);
Thomas Bogendoerfer 227321
 	spin_unlock_irqrestore(&cq->hwq.lock, flags);
Thomas Bogendoerfer 227321
 }
Thomas Bogendoerfer 227321
+
Thomas Bogendoerfer 227321
+void bnxt_qplib_flush_cqn_wq(struct bnxt_qplib_qp *qp)
Thomas Bogendoerfer 227321
+{
Thomas Bogendoerfer 227321
+	flush_workqueue(qp->scq->nq->cqn_wq);
Thomas Bogendoerfer 227321
+	if (qp->scq != qp->rcq)
Thomas Bogendoerfer 227321
+		flush_workqueue(qp->rcq->nq->cqn_wq);
Thomas Bogendoerfer 227321
+}
Thomas Bogendoerfer 227321
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.h
Thomas Bogendoerfer 227321
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
Thomas Bogendoerfer 227321
@@ -478,4 +478,5 @@ void bnxt_qplib_release_cq_locks(struct
Thomas Bogendoerfer 227321
 int bnxt_qplib_process_flush_list(struct bnxt_qplib_cq *cq,
Thomas Bogendoerfer 227321
 				  struct bnxt_qplib_cqe *cqe,
Thomas Bogendoerfer 227321
 				  int num_cqes);
Thomas Bogendoerfer 227321
+void bnxt_qplib_flush_cqn_wq(struct bnxt_qplib_qp *qp);
Thomas Bogendoerfer 227321
 #endif /* __BNXT_QPLIB_FP_H__ */