[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] 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@xxxxxxxx> --- 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); --- a/xen/drivers/cpufreq/utility.c +++ b/xen/drivers/cpufreq/utility.c @@ -458,8 +458,8 @@ int __cpufreq_set_policy(struct cpufreq_ 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); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |