summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/edp.c
diff options
context:
space:
mode:
authorDiwakar Tundlam <dtundlam@nvidia.com>2014-03-04 19:17:17 -0800
committerDiwakar Tundlam <dtundlam@nvidia.com>2014-03-05 11:36:58 -0800
commit2f926d01c292dad2e7b5c9fc80ea4a9afd357b5d (patch)
treef164e5563a8a9c023e85ce66733f3d07b8471869 /arch/arm/mach-tegra/edp.c
parent7a3dde6e8a5f6ae0bb977e00cb05bd8b458e9599 (diff)
ARM: tegra: edp: Fix memory leak on error
When calculated max-freq is invalid, free all previously allocated memory before returning an error to fix the memory leak. Bug 1458474 Change-Id: I8bc13ebf00d3229b366f18422696d4513e6c02a6 Signed-off-by: Diwakar Tundlam <dtundlam@nvidia.com> Reviewed-on: http://git-master/r/377520 Reviewed-by: Automatic_Commit_Validation_User
Diffstat (limited to 'arch/arm/mach-tegra/edp.c')
-rw-r--r--arch/arm/mach-tegra/edp.c44
1 files changed, 25 insertions, 19 deletions
diff --git a/arch/arm/mach-tegra/edp.c b/arch/arm/mach-tegra/edp.c
index ed386ee6701f..ababc9a8c794 100644
--- a/arch/arm/mach-tegra/edp.c
+++ b/arch/arm/mach-tegra/edp.c
@@ -1,7 +1,7 @@
/*
* arch/arm/mach-tegra/edp.c
*
- * Copyright (c) 2011-2013, NVIDIA CORPORATION. All Rights Reserved.
+ * Copyright (c) 2011-2014, NVIDIA CORPORATION. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
@@ -391,21 +391,14 @@ static int init_cpu_edp_limits_calculated(void)
* freq_voltage_lut_size, GFP_KERNEL);
if (!freq_voltage_lut) {
pr_err("%s: failed alloc mem for freq/voltage LUT\n", __func__);
- kfree(power_edp_calc_limits);
- kfree(reg_idle_calc_limits);
- kfree(edp_calculated_limits);
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto err;
}
ret = edp_relate_freq_voltage(clk_cpu_g, cpu_speedo_idx,
freq_voltage_lut_size, freq_voltage_lut);
- if (ret) {
- kfree(power_edp_calc_limits);
- kfree(reg_idle_calc_limits);
- kfree(edp_calculated_limits);
- kfree(freq_voltage_lut);
- return ret;
- }
+ if (ret)
+ goto err;
if (freq_voltage_lut_size != freq_voltage_lut_size_saved) {
/* release previous table if present */
@@ -417,11 +410,8 @@ static int init_cpu_edp_limits_calculated(void)
if (!freq_voltage_lut_saved) {
pr_err("%s: failed alloc mem for freq/voltage LUT\n",
__func__);
- kfree(freq_voltage_lut);
- kfree(edp_calculated_limits);
- kfree(reg_idle_calc_limits);
- kfree(power_edp_calc_limits);
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto err;
}
freq_voltage_lut_size_saved = freq_voltage_lut_size;
}
@@ -442,8 +432,10 @@ static int init_cpu_edp_limits_calculated(void)
0,
iddq_mA,
n_cores_idx);
- if (limit == -EINVAL)
- return -EINVAL;
+ if (limit == -EINVAL) {
+ ret = -EINVAL;
+ goto err;
+ }
/* apply safety cap if it is specified */
if (n_cores_idx < 4) {
cap = params->safety_cap[n_cores_idx];
@@ -536,6 +528,20 @@ static int init_cpu_edp_limits_calculated(void)
kfree(freq_voltage_lut);
return 0;
+
+ err:
+ kfree(freq_voltage_lut);
+ freq_voltage_lut = NULL;
+ kfree(edp_calculated_limits);
+ edp_calculated_limits = NULL;
+ kfree(reg_idle_calc_limits);
+ reg_idle_calc_limits = NULL;
+ kfree(power_edp_calc_limits);
+ power_edp_calc_limits = NULL;
+ kfree(freq_voltage_lut_saved);
+ freq_voltage_lut_saved = NULL;
+
+ return ret;
}
void tegra_recalculate_cpu_edp_limits(void)