From 027c4fb17544d5e2d8175043102131e20e20fd9a Mon Sep 17 00:00:00 2001 From: Selvin Xavier Date: Wed, 28 Feb 2018 09:56:38 -0800 Subject: [PATCH] bnxt_re: Fix memory leak 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. Bug: 2679 Signed-off-by: Selvin Xavier --- ...in-SQ-and-RQ-memory-if-QP-create-fai.patch | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 linux-next-pending/0021-RDMA-bnxt_re-Unpin-SQ-and-RQ-memory-if-QP-create-fai.patch 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 index 0000000..9748ab1 --- /dev/null +++ b/linux-next-pending/0021-RDMA-bnxt_re-Unpin-SQ-and-RQ-memory-if-QP-create-fai.patch @@ -0,0 +1,46 @@ +From 2378dc17244b7e5880f5eba4d9e283819fdf0c25 Mon Sep 17 00:00:00 2001 +From: Devesh Sharma +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 +Signed-off-by: Selvin Xavier +Signed-off-by: Doug Ledford +--- + 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 + -- 2.46.0