From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zumeng Chen Subject: Re: [PATCH ] cpufreq: ti-cpufreq: kfree opp_data when failure Date: Thu, 28 Sep 2017 07:49:15 +0800 Message-ID: <7b7315f0-c2e4-a09e-8769-2d15a167fa73@windriver.com> References: <1506496097-30852-1-git-send-email-zumeng.chen@windriver.com> <20170927174026.GB12211@ubuntu> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20170927174026.GB12211@ubuntu> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: Viresh Kumar Cc: d-gerlach@ti.com, tony@atomide.com, linux-pm@vger.kernel.org, rjw@rjwysocki.net, linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org List-Id: linux-pm@vger.kernel.org On 09/28/2017 01:40 AM, Viresh Kumar wrote: > On 27-09-17, 15:08, Zumeng Chen wrote: >> From: Zumeng Chen >> >> memory leakage was found by kmemleak. opp_data needs to be freed >> when failure, including fail_put_node. >> >> unreferenced object 0xccdd4c40 (size 64): >> comm "swapper", pid 1, jiffies 4294938465 (age 888.520s) >> hex dump (first 32 bytes): >> 00 7c 00 c1 98 69 d8 ce 00 24 03 ce 00 24 03 ce .|...i...$...$.. >> 20 35 23 c1 00 00 00 00 00 00 00 00 00 00 00 00 5#............. >> backtrace: >> [] kmem_cache_alloc_trace+0x2c4/0x3cc >> [] ti_cpufreq_probe+0x6c/0x334 >> [] platform_drv_probe+0x60/0xc0 >> [] driver_probe_device+0x218/0x2c4 >> [] __device_attach_driver+0xa8/0xdc >> [] bus_for_each_drv+0x70/0xa4 >> [] __device_attach+0xc0/0x124 >> [] device_initial_probe+0x1c/0x20 >> [] bus_probe_device+0x94/0x9c >> [] device_add+0x404/0x590 >> [] platform_device_add+0x11c/0x230 >> [] platform_device_register_full+0x10c/0x128 >> [] ti_cpufreq_init+0x44/0x50 >> [] do_one_initcall+0x54/0x180 >> [] kernel_init_freeable+0x270/0x33c >> [] kernel_init+0x18/0x124 >> >> Signed-off-by: Zumeng Chen >> --- >> drivers/cpufreq/ti-cpufreq.c | 5 ++++- >> 1 file changed, 4 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/cpufreq/ti-cpufreq.c b/drivers/cpufreq/ti-cpufreq.c >> index 4bf47de..ffcddcd 100644 >> --- a/drivers/cpufreq/ti-cpufreq.c >> +++ b/drivers/cpufreq/ti-cpufreq.c >> @@ -217,7 +217,8 @@ static int ti_cpufreq_init(void) >> opp_data->cpu_dev = get_cpu_device(0); >> if (!opp_data->cpu_dev) { >> pr_err("%s: Failed to get device for CPU0\n", __func__); >> - return -ENODEV; >> + ret = ENODEV; >> + goto free_opp_data; >> } >> >> opp_data->opp_node = dev_pm_opp_of_get_opp_desc_node(opp_data->cpu_dev); >> @@ -262,6 +263,8 @@ static int ti_cpufreq_init(void) >> >> fail_put_node: >> of_node_put(opp_data->opp_node); >> +free_opp_data: >> + kfree(opp_data); >> >> return ret; >> } > Acked-by: Viresh Kumar > > I also see that you are missing an of_node_put(np) in the driver. Maybe you > want to fix that as well (in a separate patch) ? Ha, thanks, I'm not sure if I follow your meanings. opp_data->opp_node will be set after goto free_opp_data, so are we safe here? opp_data->cpu_dev = get_cpu_device(0); if (!opp_data->cpu_dev) { pr_err("%s: Failed to get device for CPU0\n", __func__); ret = ENODEV; goto free_opp_data; } opp_data->opp_node = dev_pm_opp_of_get_opp_desc_node(opp_data->cpu_dev); Cheers, Zumeng >