aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJacob Shin <jacob.shin@amd.com>2011-04-27 14:32:11 -0400
committerDave Jones <davej@redhat.com>2011-05-04 11:50:57 -0400
commit27ecddc2a9f99ce4ac9a59a0acd77f7100b6d034 (patch)
tree941daeb656c519deeb8e0bd853944536e34ab80e /drivers
parent904cc1e637a00dba1b58e7752f485f90ebf2a568 (diff)
[CPUFREQ] CPU hotplug, re-create sysfs directory and symlinks
When we discover CPUs that are affected by each other's frequency/voltage transitions, the first CPU gets a sysfs directory created, and rest of the siblings get symlinks. Currently, when we hotplug off only the first CPU, all of the symlinks and the sysfs directory gets removed. Even though rest of the siblings are still online and functional, they are orphaned, and no longer governed by cpufreq. This patch, given the above scenario, creates a sysfs directory for the first sibling and symlinks for the rest of the siblings. Please note the recursive call, it was rather too ugly to roll it out. And the removal of redundant NULL setting (it is already taken care of near the top of the function). Signed-off-by: Jacob Shin <jacob.shin@amd.com> Acked-by: Mark Langsdorf <mark.langsdorf@amd.com> Reviewed-by: Thomas Renninger <trenn@suse.de> Signed-off-by: Dave Jones <davej@redhat.com> Cc: stable@kernel.org
Diffstat (limited to 'drivers')
-rw-r--r--drivers/cpufreq/cpufreq.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 2dafc5c38ae7..7c10f96c5ae9 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1208,12 +1208,28 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
1208 cpufreq_driver->exit(data); 1208 cpufreq_driver->exit(data);
1209 unlock_policy_rwsem_write(cpu); 1209 unlock_policy_rwsem_write(cpu);
1210 1210
1211 cpufreq_debug_enable_ratelimit();
1212
1213#ifdef CONFIG_HOTPLUG_CPU
1214 /* when the CPU which is the parent of the kobj is hotplugged
1215 * offline, check for siblings, and create cpufreq sysfs interface
1216 * and symlinks
1217 */
1218 if (unlikely(cpumask_weight(data->cpus) > 1)) {
1219 /* first sibling now owns the new sysfs dir */
1220 cpumask_clear_cpu(cpu, data->cpus);
1221 cpufreq_add_dev(get_cpu_sysdev(cpumask_first(data->cpus)));
1222
1223 /* finally remove our own symlink */
1224 lock_policy_rwsem_write(cpu);
1225 __cpufreq_remove_dev(sys_dev);
1226 }
1227#endif
1228
1211 free_cpumask_var(data->related_cpus); 1229 free_cpumask_var(data->related_cpus);
1212 free_cpumask_var(data->cpus); 1230 free_cpumask_var(data->cpus);
1213 kfree(data); 1231 kfree(data);
1214 per_cpu(cpufreq_cpu_data, cpu) = NULL;
1215 1232
1216 cpufreq_debug_enable_ratelimit();
1217 return 0; 1233 return 0;
1218} 1234}
1219 1235