forked from jonsmirl/mpc5200
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[PATCH] cpu hotplug: fix locking in cpufreq drivers
When calling target drivers to set frequency, we take cpucontrol lock. When we modified the code to accomodate CPU hotplug, there was an attempt to take a double lock of cpucontrol leading to a deadlock. Since the current thread context is already holding the cpucontrol lock, we dont need to make another attempt to acquire it. Now we leave a trace in current->flags indicating current thread already is under cpucontrol lock held, so we dont attempt to do this another time. Thanks to Andrew Morton for the beating:-) From: Brice Goglin <[email protected]> Build fix (akpm: this patch is still unpleasant. Ashok continues to look for a cleaner solution, doesn't he? ;)) Signed-off-by: Ashok Raj <[email protected]> Signed-off-by: Brice Goglin <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
- Loading branch information
Showing
4 changed files
with
49 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -38,7 +38,6 @@ static struct cpufreq_driver *cpufreq_driver; | |
static struct cpufreq_policy *cpufreq_cpu_data[NR_CPUS]; | ||
static DEFINE_SPINLOCK(cpufreq_driver_lock); | ||
|
||
|
||
/* internal prototypes */ | ||
static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event); | ||
static void handle_update(void *data); | ||
|
@@ -1115,24 +1114,21 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy, | |
int retval = -EINVAL; | ||
|
||
/* | ||
* Converted the lock_cpu_hotplug to preempt_disable() | ||
* and preempt_enable(). This is a bit kludgy and relies on how cpu | ||
* hotplug works. All we need is a guarantee that cpu hotplug won't make | ||
* progress on any cpu. Once we do preempt_disable(), this would ensure | ||
* that hotplug threads don't get onto this cpu, thereby delaying | ||
* the cpu remove process. | ||
* | ||
* We removed the lock_cpu_hotplug since we need to call this function | ||
* via cpu hotplug callbacks, which result in locking the cpu hotplug | ||
* thread itself. Agree this is not very clean, cpufreq community | ||
* could improve this if required. - Ashok Raj <[email protected]> | ||
* If we are already in context of hotplug thread, we dont need to | ||
* acquire the hotplug lock. Otherwise acquire cpucontrol to prevent | ||
* hotplug from removing this cpu that we are working on. | ||
*/ | ||
preempt_disable(); | ||
if (!current_in_cpu_hotplug()) | ||
lock_cpu_hotplug(); | ||
|
||
dprintk("target for CPU %u: %u kHz, relation %u\n", policy->cpu, | ||
target_freq, relation); | ||
if (cpu_online(policy->cpu) && cpufreq_driver->target) | ||
retval = cpufreq_driver->target(policy, target_freq, relation); | ||
preempt_enable(); | ||
|
||
if (!current_in_cpu_hotplug()) | ||
unlock_cpu_hotplug(); | ||
|
||
return retval; | ||
} | ||
EXPORT_SYMBOL_GPL(__cpufreq_driver_target); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters