diff options
author | Gautham R Shenoy <ego@in.ibm.com> | 2008-01-25 15:08:02 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-25 15:08:02 -0500 |
commit | 86ef5c9a8edd78e6bf92879f32329d89b2d55b5a (patch) | |
tree | 7bf46885326a6fdbb0c3596855408e9a5634dd3a /arch/powerpc/platforms | |
parent | d221938c049f4845da13c8593132595a6b9222a8 (diff) |
cpu-hotplug: replace lock_cpu_hotplug() with get_online_cpus()
Replace all lock_cpu_hotplug/unlock_cpu_hotplug from the kernel and use
get_online_cpus and put_online_cpus instead as it highlights the
refcount semantics in these operations.
The new API guarantees protection against the cpu-hotplug operation, but
it doesn't guarantee serialized access to any of the local data
structures. Hence the changes needs to be reviewed.
In case of pseries_add_processor/pseries_remove_processor, use
cpu_maps_update_begin()/cpu_maps_update_done() as we're modifying the
cpu_present_map there.
Signed-off-by: Gautham R Shenoy <ego@in.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/powerpc/platforms')
-rw-r--r-- | arch/powerpc/platforms/pseries/hotplug-cpu.c | 8 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/rtasd.c | 8 |
2 files changed, 8 insertions, 8 deletions
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c index 412e6b42986f..c4ad54e0f288 100644 --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c | |||
@@ -153,7 +153,7 @@ static int pseries_add_processor(struct device_node *np) | |||
153 | for (i = 0; i < nthreads; i++) | 153 | for (i = 0; i < nthreads; i++) |
154 | cpu_set(i, tmp); | 154 | cpu_set(i, tmp); |
155 | 155 | ||
156 | lock_cpu_hotplug(); | 156 | cpu_maps_update_begin(); |
157 | 157 | ||
158 | BUG_ON(!cpus_subset(cpu_present_map, cpu_possible_map)); | 158 | BUG_ON(!cpus_subset(cpu_present_map, cpu_possible_map)); |
159 | 159 | ||
@@ -190,7 +190,7 @@ static int pseries_add_processor(struct device_node *np) | |||
190 | } | 190 | } |
191 | err = 0; | 191 | err = 0; |
192 | out_unlock: | 192 | out_unlock: |
193 | unlock_cpu_hotplug(); | 193 | cpu_maps_update_done(); |
194 | return err; | 194 | return err; |
195 | } | 195 | } |
196 | 196 | ||
@@ -211,7 +211,7 @@ static void pseries_remove_processor(struct device_node *np) | |||
211 | 211 | ||
212 | nthreads = len / sizeof(u32); | 212 | nthreads = len / sizeof(u32); |
213 | 213 | ||
214 | lock_cpu_hotplug(); | 214 | cpu_maps_update_begin(); |
215 | for (i = 0; i < nthreads; i++) { | 215 | for (i = 0; i < nthreads; i++) { |
216 | for_each_present_cpu(cpu) { | 216 | for_each_present_cpu(cpu) { |
217 | if (get_hard_smp_processor_id(cpu) != intserv[i]) | 217 | if (get_hard_smp_processor_id(cpu) != intserv[i]) |
@@ -225,7 +225,7 @@ static void pseries_remove_processor(struct device_node *np) | |||
225 | printk(KERN_WARNING "Could not find cpu to remove " | 225 | printk(KERN_WARNING "Could not find cpu to remove " |
226 | "with physical id 0x%x\n", intserv[i]); | 226 | "with physical id 0x%x\n", intserv[i]); |
227 | } | 227 | } |
228 | unlock_cpu_hotplug(); | 228 | cpu_maps_update_done(); |
229 | } | 229 | } |
230 | 230 | ||
231 | static int pseries_smp_notifier(struct notifier_block *nb, | 231 | static int pseries_smp_notifier(struct notifier_block *nb, |
diff --git a/arch/powerpc/platforms/pseries/rtasd.c b/arch/powerpc/platforms/pseries/rtasd.c index 73401c820110..e3078ce41518 100644 --- a/arch/powerpc/platforms/pseries/rtasd.c +++ b/arch/powerpc/platforms/pseries/rtasd.c | |||
@@ -382,7 +382,7 @@ static void do_event_scan_all_cpus(long delay) | |||
382 | { | 382 | { |
383 | int cpu; | 383 | int cpu; |
384 | 384 | ||
385 | lock_cpu_hotplug(); | 385 | get_online_cpus(); |
386 | cpu = first_cpu(cpu_online_map); | 386 | cpu = first_cpu(cpu_online_map); |
387 | for (;;) { | 387 | for (;;) { |
388 | set_cpus_allowed(current, cpumask_of_cpu(cpu)); | 388 | set_cpus_allowed(current, cpumask_of_cpu(cpu)); |
@@ -390,15 +390,15 @@ static void do_event_scan_all_cpus(long delay) | |||
390 | set_cpus_allowed(current, CPU_MASK_ALL); | 390 | set_cpus_allowed(current, CPU_MASK_ALL); |
391 | 391 | ||
392 | /* Drop hotplug lock, and sleep for the specified delay */ | 392 | /* Drop hotplug lock, and sleep for the specified delay */ |
393 | unlock_cpu_hotplug(); | 393 | put_online_cpus(); |
394 | msleep_interruptible(delay); | 394 | msleep_interruptible(delay); |
395 | lock_cpu_hotplug(); | 395 | get_online_cpus(); |
396 | 396 | ||
397 | cpu = next_cpu(cpu, cpu_online_map); | 397 | cpu = next_cpu(cpu, cpu_online_map); |
398 | if (cpu == NR_CPUS) | 398 | if (cpu == NR_CPUS) |
399 | break; | 399 | break; |
400 | } | 400 | } |
401 | unlock_cpu_hotplug(); | 401 | put_online_cpus(); |
402 | } | 402 | } |
403 | 403 | ||
404 | static int rtasd(void *unused) | 404 | static int rtasd(void *unused) |