diff options
| author | Viresh Kumar <viresh.kumar@linaro.org> | 2013-01-14 13:23:03 +0000 | 
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-02-02 00:01:14 +0100 | 
| commit | b8eed8af94f9203e0cc39245ea335f4b8dc1ed31 (patch) | |
| tree | 39c9e57baa6daf91295c331c6b995c9d6286b2bc /drivers/cpufreq/freq_table.c | |
| parent | f85178048c083520bd920921744dd2c4a797fbc5 (diff) | |
| download | olio-linux-3.10-b8eed8af94f9203e0cc39245ea335f4b8dc1ed31.tar.xz olio-linux-3.10-b8eed8af94f9203e0cc39245ea335f4b8dc1ed31.zip  | |
cpufreq: Simplify __cpufreq_remove_dev()
__cpufreq_remove_dev() is called on multiple occasions: cpufreq_driver
unregister and cpu removals.
Current implementation of this routine is overly complex without much need. If
the cpu to be removed is the policy->cpu, we remove the policy first and add all
other cpus again from policy->cpus and then finally call __cpufreq_remove_dev()
again to remove the cpu to be deleted. Haahhhh..
There exist a simple solution to removal of a cpu:
- Simply use the old policy structure
- update its fields like: policy->cpu, etc.
- notify any users of cpufreq, which depend on changing policy->cpu
Hence this patch, which tries to implement the above theory. It is tested well
by myself on ARM big.LITTLE TC2 SoC, which has 5 cores (2 A15 and 3 A7). Both
A15's share same struct policy and all A7's share same policy structure.
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Tested-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/cpufreq/freq_table.c')
| -rw-r--r-- | drivers/cpufreq/freq_table.c | 9 | 
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c index 49cda256efb..aa5bd39d129 100644 --- a/drivers/cpufreq/freq_table.c +++ b/drivers/cpufreq/freq_table.c @@ -227,6 +227,15 @@ void cpufreq_frequency_table_put_attr(unsigned int cpu)  }  EXPORT_SYMBOL_GPL(cpufreq_frequency_table_put_attr); +void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy) +{ +	pr_debug("Updating show_table for new_cpu %u from last_cpu %u\n", +			policy->cpu, policy->last_cpu); +	per_cpu(cpufreq_show_table, policy->cpu) = per_cpu(cpufreq_show_table, +			policy->last_cpu); +	per_cpu(cpufreq_show_table, policy->last_cpu) = NULL; +} +  struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu)  {  	return per_cpu(cpufreq_show_table, cpu);  |