Message ID | 815f7c7cea02e05c90d5bf678ea8717f01cc9f63.1556604312.git.viresh.kumar@linaro.org |
---|---|
State | Accepted |
Commit | 4ebe36c94aed95de71a8ce6a6762226d31c938ee |
Headers | show |
Series | cpufreq: Fix kobject memleak | expand |
On Tue, Apr 30, 2019 at 11:35:52AM +0530, Viresh Kumar wrote: > Currently the error return path from kobject_init_and_add() is not > followed by a call to kobject_put() - which means we are leaking the > kobject. > > Fix it by adding a call to kobject_put() in the error path of > kobject_init_and_add(). > > Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> > --- > Tobin fixed this for schedutil already. For what its worth: Reviewed-by: Tobin C. Harding <tobin@kernel.org> Thanks Viresh, one less for me to do! Tobin
On Tuesday, April 30, 2019 8:05:52 AM CEST Viresh Kumar wrote: > Currently the error return path from kobject_init_and_add() is not > followed by a call to kobject_put() - which means we are leaking the > kobject. > > Fix it by adding a call to kobject_put() in the error path of > kobject_init_and_add(). > > Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> > --- > Tobin fixed this for schedutil already. > > drivers/cpufreq/cpufreq.c | 1 + > drivers/cpufreq/cpufreq_governor.c | 2 ++ > 2 files changed, 3 insertions(+) > > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c > index e10922709d13..bbf79544d0ad 100644 > --- a/drivers/cpufreq/cpufreq.c > +++ b/drivers/cpufreq/cpufreq.c > @@ -1098,6 +1098,7 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu) > cpufreq_global_kobject, "policy%u", cpu); > if (ret) { > pr_err("%s: failed to init policy->kobj: %d\n", __func__, ret); > + kobject_put(&policy->kobj); > goto err_free_real_cpus; > } > > diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c > index ffa9adeaba31..9d1d9bf02710 100644 > --- a/drivers/cpufreq/cpufreq_governor.c > +++ b/drivers/cpufreq/cpufreq_governor.c > @@ -459,6 +459,8 @@ int cpufreq_dbs_governor_init(struct cpufreq_policy *policy) > /* Failure, so roll back. */ > pr_err("initialization failed (dbs_data kobject init error %d)\n", ret); > > + kobject_put(&dbs_data->attr_set.kobj); > + > policy->governor_data = NULL; > > if (!have_governor_per_policy()) > Applied, thanks!
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index e10922709d13..bbf79544d0ad 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -1098,6 +1098,7 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu) cpufreq_global_kobject, "policy%u", cpu); if (ret) { pr_err("%s: failed to init policy->kobj: %d\n", __func__, ret); + kobject_put(&policy->kobj); goto err_free_real_cpus; } diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c index ffa9adeaba31..9d1d9bf02710 100644 --- a/drivers/cpufreq/cpufreq_governor.c +++ b/drivers/cpufreq/cpufreq_governor.c @@ -459,6 +459,8 @@ int cpufreq_dbs_governor_init(struct cpufreq_policy *policy) /* Failure, so roll back. */ pr_err("initialization failed (dbs_data kobject init error %d)\n", ret); + kobject_put(&dbs_data->attr_set.kobj); + policy->governor_data = NULL; if (!have_governor_per_policy())
Currently the error return path from kobject_init_and_add() is not followed by a call to kobject_put() - which means we are leaking the kobject. Fix it by adding a call to kobject_put() in the error path of kobject_init_and_add(). Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- Tobin fixed this for schedutil already. drivers/cpufreq/cpufreq.c | 1 + drivers/cpufreq/cpufreq_governor.c | 2 ++ 2 files changed, 3 insertions(+) -- 2.21.0.rc0.269.g1a574e7a288b