]> git.openfabrics.org - compat-rdma/compat-rdma.git/commitdiff
bnxt_re: Fix memory leak if QP create fails
authorSelvin Xavier <selvin.xavier@broadcom.com>
Wed, 28 Feb 2018 17:56:38 +0000 (09:56 -0800)
committerSelvin Xavier <selvin.xavier@broadcom.com>
Wed, 28 Feb 2018 18:57:43 +0000 (10:57 -0800)
Driver leaves the QP memory pinned if QP create command
fails from the FW. Avoids this scenario by adding a proper
exit path if the FW command fails.

Bug: 2679
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
linux-next-pending/0021-RDMA-bnxt_re-Unpin-SQ-and-RQ-memory-if-QP-create-fai.patch [new file with mode: 0644]

diff --git a/linux-next-pending/0021-RDMA-bnxt_re-Unpin-SQ-and-RQ-memory-if-QP-create-fai.patch b/linux-next-pending/0021-RDMA-bnxt_re-Unpin-SQ-and-RQ-memory-if-QP-create-fai.patch
new file mode 100644 (file)
index 0000000..9748ab1
--- /dev/null
@@ -0,0 +1,46 @@
+From 2378dc17244b7e5880f5eba4d9e283819fdf0c25 Mon Sep 17 00:00:00 2001
+From: Devesh Sharma <devesh.sharma@broadcom.com>
+Date: Thu, 15 Feb 2018 21:20:10 -0800
+Subject: [PATCH 2/8] RDMA/bnxt_re: Unpin SQ and RQ memory if QP create fails
+
+Driver leaves the QP memory pinned if QP create command
+fails from the FW. Avoids this scenario by adding a proper
+exit path if the FW command fails.
+
+Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
+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 | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+index daa3fd1..040eace 100644
+--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
++++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+@@ -1253,7 +1253,7 @@ struct ib_qp *bnxt_re_create_qp(struct ib_pd *ib_pd,
+               rc = bnxt_qplib_create_qp(&rdev->qplib_res, &qp->qplib_qp);
+               if (rc) {
+                       dev_err(rdev_to_dev(rdev), "Failed to create HW QP");
+-                      goto fail;
++                      goto free_umem;
+               }
+       }
+@@ -1281,6 +1281,13 @@ struct ib_qp *bnxt_re_create_qp(struct ib_pd *ib_pd,
+       return &qp->ib_qp;
+ qp_destroy:
+       bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp);
++free_umem:
++      if (udata) {
++              if (qp->rumem)
++                      ib_umem_release(qp->rumem);
++              if (qp->sumem)
++                      ib_umem_release(qp->sumem);
++      }
+ fail:
+       kfree(qp);
+       return ERR_PTR(rc);
+-- 
+1.8.3.1
+