Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp2745531ybg; Mon, 28 Oct 2019 01:29:22 -0700 (PDT) X-Google-Smtp-Source: APXvYqwIXt6Eh3gwhy2f7Uh84IjW8WN+Qu8qWNURmxdl0KjT20bMGS86qMJIao76MpzjwagvES8X X-Received: by 2002:a17:906:34c8:: with SMTP id h8mr14178476ejb.135.1572251362692; Mon, 28 Oct 2019 01:29:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572251362; cv=none; d=google.com; s=arc-20160816; b=bixV8GrOlMDqn1jnf1IQ7q9MhNc5B1rtegUXAWSv5ufJ1yfmC+8pT/Rdp6fdAPv7se +HZolpvUpDn/4ZZXX19R7u7Cw8PkdcL0N9xt9WQiy/Lz7vqEEWPCNQxoH+d24+oQ1uOF NTjgd1dTQx5wOb4cLfvuoJzitEVI0DqY3e/4p+nsom6Tr2vrU5NkAUEJ16fHtTXgUu60 MA2Ep/G+5EY5OTGvsT8AMklbxJjANvTbrWdXKQNsbw8ix7DWg93baQQNI1UlS4WUuIaS NsrwZK8rovszcQizdzgWfP7J4pWR305h7MJgMl6lLilRYzXLR+h1P9pDykdmEKNTPoC6 cZGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=3vGe253psCT9lH7tA45gfebaryCoXAQi/jVgFKQfx0Q=; b=Nx93DL72qoEExigDqVuByMjMROo+H5BU1PqltdeI8Jqi9Aqn/5mrugQiePXDwf3oHT khU5FSicxLn4ghyQD70NMg0Az8SZgkOo+JaLoGu8T4W1iJvKqWi9DNpWC2iJ9Gvse/y+ aPwvj3PbSb6eszaAMhvRuQfbC4cq1SJLQstI5nTyLtKhSh480uDH0VjJLAXYqVNlh/5y 5aVZf+5hxqVm2j+/Zs4S7P/oQTlg8yfKI5+aMC5gKg3QgxHpmrXfIgECHOo1BPLZ/vlT LvIBvLk2eIxxLk0/4kU2lON4N5qB9TKQzaGMI7n43GTG8LiTe7ij4gUQSD3PBOJ81Hc4 VMSw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="upV/YwaS"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c2si6636476eda.322.2019.10.28.01.28.59; Mon, 28 Oct 2019 01:29:22 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="upV/YwaS"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731849AbfJ0VVG (ORCPT + 99 others); Sun, 27 Oct 2019 17:21:06 -0400 Received: from mail.kernel.org ([198.145.29.99]:41758 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731838AbfJ0VVD (ORCPT ); Sun, 27 Oct 2019 17:21:03 -0400 Received: from localhost (100.50.158.77.rev.sfr.net [77.158.50.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 18A79205C9; Sun, 27 Oct 2019 21:21:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1572211262; bh=ffY51uUFwKpkIbitwsoWl4TS9Ry0fSsB7ZSfmqk+0A0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=upV/YwaS+JZlf3vpfAWDCFEeaMHNn5FejeZQLe7/zvU0B5PG+/r/65uBRhOnZogFO qqW8FpMP1EzX4YUN/hLhQhvfZPdFXiimJfh/6s7sVQGSa6du9vdOMUXFNGJYvCZmmo P/APUXIeWF/TQdYSDd71MggvnUS7/a3dmtgvSJC8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?Christian=20K=C3=B6nig?= , Navid Emamdoost , Alex Deucher , Sasha Levin Subject: [PATCH 5.3 045/197] drm/amdgpu: fix multiple memory leaks in acp_hw_init Date: Sun, 27 Oct 2019 21:59:23 +0100 Message-Id: <20191027203354.136852913@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191027203351.684916567@linuxfoundation.org> References: <20191027203351.684916567@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Navid Emamdoost [ Upstream commit 57be09c6e8747bf48704136d9e3f92bfb93f5725 ] In acp_hw_init there are some allocations that needs to be released in case of failure: 1- adev->acp.acp_genpd should be released if any allocation attemp for adev->acp.acp_cell, adev->acp.acp_res or i2s_pdata fails. 2- all of those allocations should be released if mfd_add_hotplug_devices or pm_genpd_add_device fail. 3- Release is needed in case of time out values expire. Reviewed-by: Christian König Signed-off-by: Navid Emamdoost Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c | 34 ++++++++++++++++--------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c index eba42c752bca3..82155ac3288a0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c @@ -189,7 +189,7 @@ static int acp_hw_init(void *handle) u32 val = 0; u32 count = 0; struct device *dev; - struct i2s_platform_data *i2s_pdata; + struct i2s_platform_data *i2s_pdata = NULL; struct amdgpu_device *adev = (struct amdgpu_device *)handle; @@ -231,20 +231,21 @@ static int acp_hw_init(void *handle) adev->acp.acp_cell = kcalloc(ACP_DEVS, sizeof(struct mfd_cell), GFP_KERNEL); - if (adev->acp.acp_cell == NULL) - return -ENOMEM; + if (adev->acp.acp_cell == NULL) { + r = -ENOMEM; + goto failure; + } adev->acp.acp_res = kcalloc(5, sizeof(struct resource), GFP_KERNEL); if (adev->acp.acp_res == NULL) { - kfree(adev->acp.acp_cell); - return -ENOMEM; + r = -ENOMEM; + goto failure; } i2s_pdata = kcalloc(3, sizeof(struct i2s_platform_data), GFP_KERNEL); if (i2s_pdata == NULL) { - kfree(adev->acp.acp_res); - kfree(adev->acp.acp_cell); - return -ENOMEM; + r = -ENOMEM; + goto failure; } switch (adev->asic_type) { @@ -341,14 +342,14 @@ static int acp_hw_init(void *handle) r = mfd_add_hotplug_devices(adev->acp.parent, adev->acp.acp_cell, ACP_DEVS); if (r) - return r; + goto failure; for (i = 0; i < ACP_DEVS ; i++) { dev = get_mfd_cell_dev(adev->acp.acp_cell[i].name, i); r = pm_genpd_add_device(&adev->acp.acp_genpd->gpd, dev); if (r) { dev_err(dev, "Failed to add dev to genpd\n"); - return r; + goto failure; } } @@ -367,7 +368,8 @@ static int acp_hw_init(void *handle) break; if (--count == 0) { dev_err(&adev->pdev->dev, "Failed to reset ACP\n"); - return -ETIMEDOUT; + r = -ETIMEDOUT; + goto failure; } udelay(100); } @@ -384,7 +386,8 @@ static int acp_hw_init(void *handle) break; if (--count == 0) { dev_err(&adev->pdev->dev, "Failed to reset ACP\n"); - return -ETIMEDOUT; + r = -ETIMEDOUT; + goto failure; } udelay(100); } @@ -393,6 +396,13 @@ static int acp_hw_init(void *handle) val &= ~ACP_SOFT_RESET__SoftResetAud_MASK; cgs_write_register(adev->acp.cgs_device, mmACP_SOFT_RESET, val); return 0; + +failure: + kfree(i2s_pdata); + kfree(adev->acp.acp_res); + kfree(adev->acp.acp_cell); + kfree(adev->acp.acp_genpd); + return r; } /** -- 2.20.1