Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1237211pxk; Thu, 10 Sep 2020 10:16:05 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzRbKwb1wiGLxyCouxm9HEkF2tq6nM7hdRBPJbx8M4Yrpd9/NV5HtIXSGsf3gcTK9mZezE/ X-Received: by 2002:a17:906:455:: with SMTP id e21mr10498494eja.170.1599758164916; Thu, 10 Sep 2020 10:16:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599758164; cv=none; d=google.com; s=arc-20160816; b=ykFmGZiqjVHN++3kKWPu3V/8kxHmkMX82CeJKBvuQh9IPvSevofqCu/Q4Mbe8YQqsi 8INdbmqUncw2ixi6fulaJKI4Xj8O/uMGxl54REW5ckEjivjLAyr7lKQg6+45fUHK+KrF dSKbx7OUfxjO5AW6u6EGF830OPztNCFxP/P9HarBLUZxeExo251tEEApnmq1Wmt7ziYJ Q1OEhGepCDscyH2wTo+UsiD+j6R/h1+TZgDrs60RdClfrj1eMP8pV/PGjWYeWkCoXrQd 1NsRXRMaa2Lx+IGhRZWA3qngpUeRv447VH8DLoBXWyoY5sFRMLEqgd3qVfcXIeDt9GKJ mSOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:references:in-reply-to:message-id:date :subject:cc:from:dkim-signature; bh=FaJXhfrjUU4Eb8omzwhQgbkduynoMOFupoGOfbaZ3s0=; b=c28gvoyNhOiFFQXDoQ5BjekwttfyM0KkM7NnLGtsBYMc6gz7BEBSqVsvPBv3vOGKFO CCiUSU7wao7kxRMpXlQHktwyss27m+NVF7wBs50NrOJYzLo4+FgeSSRHwybhsqgkHjOB vOVSdWOgAijLfd+TZCHBAAqTKt+tc1xw/a+ClVs9uFUDBvaYI+dskhIHQ3xMZv07N7W6 GyBK9UzUjDupnQVxDK9rozD6j5I3Gol2dTbBxK/hAbQULEtdlpkbK6USzZmbvvlwcqVe Pw8I9h39Y2eIZEeEg/Z33+PpPbRSL5J172KzknzP0OUR6wc7D4xP6LYsAWPVa52+GsJs nhTw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@sslab.ics.keio.ac.jp header.s=google header.b="d8XEy/h9"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id df4si3820454edb.378.2020.09.10.10.15.42; Thu, 10 Sep 2020 10:16:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@sslab.ics.keio.ac.jp header.s=google header.b="d8XEy/h9"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726901AbgIJRPB (ORCPT + 99 others); Thu, 10 Sep 2020 13:15:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47406 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726792AbgIJQfB (ORCPT ); Thu, 10 Sep 2020 12:35:01 -0400 Received: from mail-pf1-x444.google.com (mail-pf1-x444.google.com [IPv6:2607:f8b0:4864:20::444]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6CECBC0617AA for ; Thu, 10 Sep 2020 09:34:59 -0700 (PDT) Received: by mail-pf1-x444.google.com with SMTP id n14so4939871pff.6 for ; Thu, 10 Sep 2020 09:34:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sslab.ics.keio.ac.jp; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FaJXhfrjUU4Eb8omzwhQgbkduynoMOFupoGOfbaZ3s0=; b=d8XEy/h9aLwc461GtbYpEe6YJG5kQc027sQcQm8cbVphWcNTxqAgmcr9eSuRX9UQQ9 26gVkQDbm6fPZ7+oet9lRe3ok5l8ezihGzUh4bzHJA63YTEZze9hlwD3/2FlMzV/2BXl XuEa2TERzj29I2cbOZy3ofzWAigoEqHbPHn/o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FaJXhfrjUU4Eb8omzwhQgbkduynoMOFupoGOfbaZ3s0=; b=NujhxqCbFe2x5ADfRchVUhu44aFJliM3ZpBaSS6fzF3jy+HkpuRHVxm2BHZXmmz3XI DZBFhYct+q5P6rBOMBw4IpyZIRV8ZM1pcxFBwKOxq3Io7BUjKuqbW16T8bTq2DTlhMgf 8u+zPGD6sEYvIDFEpGPibU3tQCx5P1/p9emBqW80k95nJ+uBoRHf1zyQRvOGnsbKXoMl WelW9IeNVLEFFgq5gmS87eVOZJMVhGl9s45lImIvqZdOgvp9bcCNH/hcqL4W0iFfJ5EB v38jD7yH8oaki8Ovu+Tyf5I5uTDm/rEYbnTt1eKuzvmqcDK0o07PpQQJl54wxOE4kKTZ Sc+A== X-Gm-Message-State: AOAM531JX1jH3XusKXaq3Lhk4dWkHdhchMkCTK3pylpMgwzvXUm1eEtM 1o7ExCr0/Z9I5yXcBk9Hhp3eREmBIhSXslOr7ZY= X-Received: by 2002:a63:1402:: with SMTP id u2mr4824306pgl.400.1599755698842; Thu, 10 Sep 2020 09:34:58 -0700 (PDT) Received: from brooklyn.i.sslab.ics.keio.ac.jp (sslab-relay.ics.keio.ac.jp. [131.113.126.173]) by smtp.googlemail.com with ESMTPSA id x25sm5586983pgk.26.2020.09.10.09.34.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2020 09:34:58 -0700 (PDT) From: Keita Suzuki Cc: keitasuzuki.park@sslab.ics.keio.ac.jp, takafumi@sslab.ics.keio.ac.jp, Michal Kalderon , Ariel Elior , Doug Ledford , Jason Gunthorpe , Yuval Bason , linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] qedr: fix resource leak in qedr_create_qp Date: Thu, 10 Sep 2020 16:34:38 +0000 Message-Id: <20200910163438.20495-1-keitasuzuki.park@sslab.ics.keio.ac.jp> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: To: unlisted-recipients:; (no To-header on input) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When xa_insert() fails, the acquired resource in qedr_create_qp should also be freed. However, current implementation does not handle the error. Fix this by adding a new goto label that calls qedr_free_qp_resources. Fixes: 1212767e23bb ("qedr: Add wrapping generic structure for qpidr and adjust idr routines.") Signed-off-by: Keita Suzuki --- changelog(v2): Change numbered labels to descriptive labels drivers/infiniband/hw/qedr/verbs.c | 52 ++++++++++++++++-------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c index b49bef94637e..3b4c84f67023 100644 --- a/drivers/infiniband/hw/qedr/verbs.c +++ b/drivers/infiniband/hw/qedr/verbs.c @@ -2112,6 +2112,28 @@ static int qedr_create_kernel_qp(struct qedr_dev *dev, return rc; } +static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp, + struct ib_udata *udata) +{ + struct qedr_ucontext *ctx = + rdma_udata_to_drv_context(udata, struct qedr_ucontext, + ibucontext); + int rc; + + if (qp->qp_type != IB_QPT_GSI) { + rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp); + if (rc) + return rc; + } + + if (qp->create_type == QEDR_QP_CREATE_USER) + qedr_cleanup_user(dev, ctx, qp); + else + qedr_cleanup_kernel(dev, qp); + + return 0; +} + struct ib_qp *qedr_create_qp(struct ib_pd *ibpd, struct ib_qp_init_attr *attrs, struct ib_udata *udata) @@ -2158,19 +2180,21 @@ struct ib_qp *qedr_create_qp(struct ib_pd *ibpd, rc = qedr_create_kernel_qp(dev, qp, ibpd, attrs); if (rc) - goto err; + goto out_free_qp; qp->ibqp.qp_num = qp->qp_id; if (rdma_protocol_iwarp(&dev->ibdev, 1)) { rc = xa_insert(&dev->qps, qp->qp_id, qp, GFP_KERNEL); if (rc) - goto err; + goto out_free_qp_resources; } return &qp->ibqp; -err: +out_free_qp_resources: + qedr_free_qp_resources(dev, qp, udata); +out_free_qp: kfree(qp); return ERR_PTR(-EFAULT); @@ -2671,28 +2695,6 @@ int qedr_query_qp(struct ib_qp *ibqp, return rc; } -static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp, - struct ib_udata *udata) -{ - struct qedr_ucontext *ctx = - rdma_udata_to_drv_context(udata, struct qedr_ucontext, - ibucontext); - int rc; - - if (qp->qp_type != IB_QPT_GSI) { - rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp); - if (rc) - return rc; - } - - if (qp->create_type == QEDR_QP_CREATE_USER) - qedr_cleanup_user(dev, ctx, qp); - else - qedr_cleanup_kernel(dev, qp); - - return 0; -} - int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) { struct qedr_qp *qp = get_qedr_qp(ibqp); -- 2.17.1