diff options
| author | Ashok Raj <ashok.raj@intel.com> | 2005-11-28 16:43:46 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-28 17:42:23 -0500 |
| commit | a9d9baa1e819b2f92f9cfa5240f766c535e636a6 (patch) | |
| tree | 0ae15e5b1071b395affa0ac9abf6fd746ad60b0e /drivers/cpufreq | |
| parent | e0f39591cc178026607fcbbe9a53be435fe8285d (diff) | |
[PATCH] clean up lock_cpu_hotplug() in cpufreq
There are some callers in cpufreq hotplug notify path that the lowest
function calls lock_cpu_hotplug(). The lock is already held during
cpu_up() and cpu_down() calls when the notify calls are broadcast to
registered clients.
Ideally if possible, we could disable_preempt() at the highest caller and
make sure we dont sleep in the path down in cpufreq->driver_target() calls
but the calls are so intertwined and cumbersome to cleanup.
Hence we consistently use lock_cpu_hotplug() and unlock_cpu_hotplug() in
all places.
- Removed export of cpucontrol semaphore and made it static.
- removed explicit uses of up/down with lock_cpu_hotplug()
so we can keep track of the the callers in same thread context and
just keep refcounts without calling a down() that causes a deadlock.
- Removed current_in_hotplug() uses
- Removed PF_HOTPLUG_CPU in sched.h introduced for the current_in_hotplug()
temporary workaround.
Tested with insmod of cpufreq_stat.ko, and logical online/offline
to make sure we dont have any hang situations.
Signed-off-by: Ashok Raj <ashok.raj@intel.com>
Cc: Zwane Mwaikambo <zwane@linuxpower.ca>
Cc: Shaohua Li <shaohua.li@intel.com>
Cc: "Siddha, Suresh B" <suresh.b.siddha@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/cpufreq')
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 12 |
1 files changed, 2 insertions, 10 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 1c0f62d0f938..815902c2c856 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -1113,21 +1113,13 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy, | |||
| 1113 | { | 1113 | { |
| 1114 | int retval = -EINVAL; | 1114 | int retval = -EINVAL; |
| 1115 | 1115 | ||
| 1116 | /* | 1116 | lock_cpu_hotplug(); |
| 1117 | * If we are already in context of hotplug thread, we dont need to | ||
| 1118 | * acquire the hotplug lock. Otherwise acquire cpucontrol to prevent | ||
| 1119 | * hotplug from removing this cpu that we are working on. | ||
| 1120 | */ | ||
| 1121 | if (!current_in_cpu_hotplug()) | ||
| 1122 | lock_cpu_hotplug(); | ||
| 1123 | |||
| 1124 | dprintk("target for CPU %u: %u kHz, relation %u\n", policy->cpu, | 1117 | dprintk("target for CPU %u: %u kHz, relation %u\n", policy->cpu, |
| 1125 | target_freq, relation); | 1118 | target_freq, relation); |
| 1126 | if (cpu_online(policy->cpu) && cpufreq_driver->target) | 1119 | if (cpu_online(policy->cpu) && cpufreq_driver->target) |
| 1127 | retval = cpufreq_driver->target(policy, target_freq, relation); | 1120 | retval = cpufreq_driver->target(policy, target_freq, relation); |
| 1128 | 1121 | ||
| 1129 | if (!current_in_cpu_hotplug()) | 1122 | unlock_cpu_hotplug(); |
| 1130 | unlock_cpu_hotplug(); | ||
| 1131 | 1123 | ||
| 1132 | return retval; | 1124 | return retval; |
| 1133 | } | 1125 | } |
