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 | |
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')
-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 | } |