diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 25acf478c9e8..23a63207d747 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -38,7 +38,6 @@ static struct cpufreq_driver *cpufreq_driver; | |||
38 | static struct cpufreq_policy *cpufreq_cpu_data[NR_CPUS]; | 38 | static struct cpufreq_policy *cpufreq_cpu_data[NR_CPUS]; |
39 | static DEFINE_SPINLOCK(cpufreq_driver_lock); | 39 | static DEFINE_SPINLOCK(cpufreq_driver_lock); |
40 | 40 | ||
41 | |||
42 | /* internal prototypes */ | 41 | /* internal prototypes */ |
43 | static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event); | 42 | static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event); |
44 | static void handle_update(void *data); | 43 | static void handle_update(void *data); |
@@ -1115,24 +1114,21 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy, | |||
1115 | int retval = -EINVAL; | 1114 | int retval = -EINVAL; |
1116 | 1115 | ||
1117 | /* | 1116 | /* |
1118 | * Converted the lock_cpu_hotplug to preempt_disable() | 1117 | * If we are already in context of hotplug thread, we dont need to |
1119 | * and preempt_enable(). This is a bit kludgy and relies on how cpu | 1118 | * acquire the hotplug lock. Otherwise acquire cpucontrol to prevent |
1120 | * hotplug works. All we need is a guarantee that cpu hotplug won't make | 1119 | * hotplug from removing this cpu that we are working on. |
1121 | * progress on any cpu. Once we do preempt_disable(), this would ensure | ||
1122 | * that hotplug threads don't get onto this cpu, thereby delaying | ||
1123 | * the cpu remove process. | ||
1124 | * | ||
1125 | * We removed the lock_cpu_hotplug since we need to call this function | ||
1126 | * via cpu hotplug callbacks, which result in locking the cpu hotplug | ||
1127 | * thread itself. Agree this is not very clean, cpufreq community | ||
1128 | * could improve this if required. - Ashok Raj <ashok.raj@intel.com> | ||
1129 | */ | 1120 | */ |
1130 | preempt_disable(); | 1121 | if (!current_in_cpu_hotplug()) |
1122 | lock_cpu_hotplug(); | ||
1123 | |||
1131 | dprintk("target for CPU %u: %u kHz, relation %u\n", policy->cpu, | 1124 | dprintk("target for CPU %u: %u kHz, relation %u\n", policy->cpu, |
1132 | target_freq, relation); | 1125 | target_freq, relation); |
1133 | if (cpu_online(policy->cpu) && cpufreq_driver->target) | 1126 | if (cpu_online(policy->cpu) && cpufreq_driver->target) |
1134 | retval = cpufreq_driver->target(policy, target_freq, relation); | 1127 | retval = cpufreq_driver->target(policy, target_freq, relation); |
1135 | preempt_enable(); | 1128 | |
1129 | if (!current_in_cpu_hotplug()) | ||
1130 | unlock_cpu_hotplug(); | ||
1131 | |||
1136 | return retval; | 1132 | return retval; |
1137 | } | 1133 | } |
1138 | EXPORT_SYMBOL_GPL(__cpufreq_driver_target); | 1134 | EXPORT_SYMBOL_GPL(__cpufreq_driver_target); |