diff mbox

[3/8] cpufreq: powerenv: Fix memory leak

Message ID f67b4b395c777a3e933ab51eafcd76b1299bf1fb.1464776797.git.viresh.kumar@linaro.org
State New
Headers show

Commit Message

Viresh Kumar June 1, 2016, 10:34 a.m. UTC
The policy is copied (unnecessarily) and is never freed. Fix it by just
getting a reference to the existing policy structure and putting it
back.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>

---
 drivers/cpufreq/powernv-cpufreq.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

-- 
2.7.1.410.g6faf27b

Comments

Viresh Kumar June 2, 2016, 11:43 a.m. UTC | #1
On 02-06-16, 21:37, Michael Ellerman wrote:
> On Thu, 2016-06-02 at 16:52 +0530, Viresh Kumar wrote:

> > On 02-06-16, 21:08, Michael Ellerman wrote:

> > > On Wed, 2016-06-01 at 16:04 +0530, Viresh Kumar wrote:

> > > 

> > > > The policy is copied (unnecessarily) and is never freed. Fix it by just

> > > > getting a reference to the existing policy structure and putting it

> > > > back.

> > > > 

> > > > Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>

> > > 

> > > When was it broken, always?

> > > 

> > > Cc: stable ?

> > 

> > Its a small memory leak and its not that we will fail on something. So

> > didn't bother to add those details, but in case they are required:

> > 

> > Cc: <stable@vger.kernel.org> # 4.3+

> > Fixes: 227942809b52 ("cpufreq: powernv: Restore cpu frequency to policy->cur on unthrottling")

> 

> OK. I can't actually see where the copy is?

> 

> But if we are leaking even a small amount of memory in a loop like that, in a

> function that's run semi-regularly, then it's going to add up eventually.


Urg, it wasn't a memory leak actually. I misread.

I somehow thought that cpufreq_get_policy() is also allocating memory
for the policy, but it just memcpy's it into the callers buffer. So,
that's not a problem really.

This patch should be just dropped. Sorry for the noise.

-- 
viresh
diff mbox

Patch

diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
index 54c45368e3f1..96bb4acd366e 100644
--- a/drivers/cpufreq/powernv-cpufreq.c
+++ b/drivers/cpufreq/powernv-cpufreq.c
@@ -756,15 +756,18 @@  void powernv_cpufreq_work_fn(struct work_struct *work)
 
 	chip->restore = false;
 	for_each_cpu(cpu, &mask) {
+		struct cpufreq_policy *policy = cpufreq_cpu_get(cpu)
 		int index;
-		struct cpufreq_policy policy;
 
-		cpufreq_get_policy(&policy, cpu);
-		cpufreq_frequency_table_target(&policy, policy.freq_table,
-					       policy.cur,
+		if (!policy)
+			continue;
+
+		cpufreq_frequency_table_target(policy, policy->freq_table,
+					       policy->cur,
 					       CPUFREQ_RELATION_C, &index);
-		powernv_cpufreq_target_index(&policy, index);
-		cpumask_andnot(&mask, &mask, policy.cpus);
+		powernv_cpufreq_target_index(policy, index);
+		cpumask_andnot(&mask, &mask, policy->cpus);
+		cpufreq_cpu_put(policy);
 	}
 out:
 	put_online_cpus();