diff options
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 20 | 
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 2dafc5c38ae..7c10f96c5ae 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)  		cpufreq_driver->exit(data);  	unlock_policy_rwsem_write(cpu); +	cpufreq_debug_enable_ratelimit(); + +#ifdef CONFIG_HOTPLUG_CPU +	/* when the CPU which is the parent of the kobj is hotplugged +	 * offline, check for siblings, and create cpufreq sysfs interface +	 * and symlinks +	 */ +	if (unlikely(cpumask_weight(data->cpus) > 1)) { +		/* first sibling now owns the new sysfs dir */ +		cpumask_clear_cpu(cpu, data->cpus); +		cpufreq_add_dev(get_cpu_sysdev(cpumask_first(data->cpus))); + +		/* finally remove our own symlink */ +		lock_policy_rwsem_write(cpu); +		__cpufreq_remove_dev(sys_dev); +	} +#endif +  	free_cpumask_var(data->related_cpus);  	free_cpumask_var(data->cpus);  	kfree(data); -	per_cpu(cpufreq_cpu_data, cpu) = NULL; -	cpufreq_debug_enable_ratelimit();  	return 0;  }  |