diff options
author | Jan Beulich <jbeulich@suse.com> | 2011-10-14 10:15:54 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2011-10-14 10:15:54 +0200 |
commit | 52776ac43ce4ad58ce104ca8426b1ee03622d61b (patch) | |
tree | 327eb87b3bfc241e2acb79172a802ebb1086ffe6 /xen/drivers/cpufreq | |
parent | 96ecd1276c0d89ffd33ecb77ccd804a5ae2f799c (diff) | |
download | xen-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.c | 8 | ||||
-rw-r--r-- | xen/drivers/cpufreq/utility.c | 2 |
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); |