aboutsummaryrefslogtreecommitdiffstats
path: root/xen/drivers/cpufreq
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2011-10-14 10:15:54 +0200
committerJan Beulich <jbeulich@suse.com>2011-10-14 10:15:54 +0200
commit52776ac43ce4ad58ce104ca8426b1ee03622d61b (patch)
tree327eb87b3bfc241e2acb79172a802ebb1086ffe6 /xen/drivers/cpufreq
parent96ecd1276c0d89ffd33ecb77ccd804a5ae2f799c (diff)
downloadxen-52776ac43ce4ad58ce104ca8426b1ee03622d61b.tar.gz
xen-52776ac43ce4ad58ce104ca8426b1ee03622d61b.tar.bz2
xen-52776ac43ce4ad58ce104ca8426b1ee03622d61b.zip
cpufreq: error path fixes
This fixes an actual bug (failure to exit from a function after an allocation failure), an inconsistency (not removing the cpufreq_dom list member upon failure), and a latent bug (not clearing the current governor upon governor initialization failure when there was no old one; latent because the only current code path leading to this situation frees the policy upon failure and hence the governor not getting cleared is benign). Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/drivers/cpufreq')
-rw-r--r--xen/drivers/cpufreq/cpufreq.c8
-rw-r--r--xen/drivers/cpufreq/utility.c2
2 files changed, 6 insertions, 4 deletions
diff --git a/xen/drivers/cpufreq/cpufreq.c b/xen/drivers/cpufreq/cpufreq.c
index cf36de8011..c7fac7b177 100644
--- a/xen/drivers/cpufreq/cpufreq.c
+++ b/xen/drivers/cpufreq/cpufreq.c
@@ -176,8 +176,10 @@ int cpufreq_add_cpu(unsigned int cpu)
if (!domexist || hw_all) {
policy = xzalloc(struct cpufreq_policy);
- if (!policy)
+ if (!policy) {
ret = -ENOMEM;
+ goto err0;
+ }
policy->cpu = cpu;
per_cpu(cpufreq_cpu_policy, cpu) = policy;
@@ -186,7 +188,7 @@ int cpufreq_add_cpu(unsigned int cpu)
if (ret) {
xfree(policy);
per_cpu(cpufreq_cpu_policy, cpu) = NULL;
- return ret;
+ goto err0;
}
if (cpufreq_verbose)
printk("CPU %u initialization completed\n", cpu);
@@ -243,7 +245,7 @@ err1:
cpufreq_driver->exit(policy);
xfree(policy);
}
-
+err0:
if (cpus_empty(cpufreq_dom->map)) {
list_del(&cpufreq_dom->node);
xfree(cpufreq_dom);
diff --git a/xen/drivers/cpufreq/utility.c b/xen/drivers/cpufreq/utility.c
index 800438d136..3694435487 100644
--- a/xen/drivers/cpufreq/utility.c
+++ b/xen/drivers/cpufreq/utility.c
@@ -458,8 +458,8 @@ int __cpufreq_set_policy(struct cpufreq_policy *data,
data->governor->name);
/* new governor failed, so re-start old one */
+ data->governor = old_gov;
if (old_gov) {
- data->governor = old_gov;
__cpufreq_governor(data, CPUFREQ_GOV_START);
printk(KERN_WARNING "Still stay at %s governor\n",
data->governor->name);