diff options
Diffstat (limited to 'drivers/cpufreq')
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 19 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq_conservative.c | 8 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq_stats.c | 1 | 
3 files changed, 21 insertions, 7 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 2d5d575e889..75d293eeb3e 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -1113,6 +1113,8 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)  	unsigned int cpu = sys_dev->id;  	unsigned long flags;  	struct cpufreq_policy *data; +	struct kobject *kobj; +	struct completion *cmp;  #ifdef CONFIG_SMP  	struct sys_device *cpu_sys_dev;  	unsigned int j; @@ -1141,10 +1143,11 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)  		dprintk("removing link\n");  		cpumask_clear_cpu(cpu, data->cpus);  		spin_unlock_irqrestore(&cpufreq_driver_lock, flags); -		sysfs_remove_link(&sys_dev->kobj, "cpufreq"); +		kobj = &sys_dev->kobj;  		cpufreq_cpu_put(data);  		cpufreq_debug_enable_ratelimit();  		unlock_policy_rwsem_write(cpu); +		sysfs_remove_link(kobj, "cpufreq");  		return 0;  	}  #endif @@ -1181,7 +1184,10 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)  				data->governor->name, CPUFREQ_NAME_LEN);  #endif  			cpu_sys_dev = get_cpu_sysdev(j); -			sysfs_remove_link(&cpu_sys_dev->kobj, "cpufreq"); +			kobj = &cpu_sys_dev->kobj; +			unlock_policy_rwsem_write(cpu); +			sysfs_remove_link(kobj, "cpufreq"); +			lock_policy_rwsem_write(cpu);  			cpufreq_cpu_put(data);  		}  	} @@ -1192,19 +1198,22 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)  	if (cpufreq_driver->target)  		__cpufreq_governor(data, CPUFREQ_GOV_STOP); -	kobject_put(&data->kobj); +	kobj = &data->kobj; +	cmp = &data->kobj_unregister; +	unlock_policy_rwsem_write(cpu); +	kobject_put(kobj);  	/* we need to make sure that the underlying kobj is actually  	 * not referenced anymore by anybody before we proceed with  	 * unloading.  	 */  	dprintk("waiting for dropping of refcount\n"); -	wait_for_completion(&data->kobj_unregister); +	wait_for_completion(cmp);  	dprintk("wait complete\n"); +	lock_policy_rwsem_write(cpu);  	if (cpufreq_driver->exit)  		cpufreq_driver->exit(data); -  	unlock_policy_rwsem_write(cpu);  	free_cpumask_var(data->related_cpus); diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c index 599a40b25cb..3a147874a46 100644 --- a/drivers/cpufreq/cpufreq_conservative.c +++ b/drivers/cpufreq/cpufreq_conservative.c @@ -444,6 +444,7 @@ static struct attribute_group dbs_attr_group_old = {  static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)  {  	unsigned int load = 0; +	unsigned int max_load = 0;  	unsigned int freq_target;  	struct cpufreq_policy *policy; @@ -501,6 +502,9 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)  			continue;  		load = 100 * (wall_time - idle_time) / wall_time; + +		if (load > max_load) +			max_load = load;  	}  	/* @@ -511,7 +515,7 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)  		return;  	/* Check for frequency increase */ -	if (load > dbs_tuners_ins.up_threshold) { +	if (max_load > dbs_tuners_ins.up_threshold) {  		this_dbs_info->down_skip = 0;  		/* if we are already at full speed then break out early */ @@ -538,7 +542,7 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)  	 * can support the current CPU usage without triggering the up  	 * policy. To be safe, we focus 10 points under the threshold.  	 */ -	if (load < (dbs_tuners_ins.down_threshold - 10)) { +	if (max_load < (dbs_tuners_ins.down_threshold - 10)) {  		freq_target = (dbs_tuners_ins.freq_step * policy->max) / 100;  		this_dbs_info->requested_freq -= freq_target; diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index 5a62d678dd1..00d73fc8e4e 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c @@ -10,6 +10,7 @@   */  #include <linux/kernel.h> +#include <linux/slab.h>  #include <linux/sysdev.h>  #include <linux/cpu.h>  #include <linux/sysfs.h>  |