diff options
Diffstat (limited to 'arch/ia64/kernel/smp.c')
| -rw-r--r-- | arch/ia64/kernel/smp.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c index 657ac99a451c..6ab95ceaf9d4 100644 --- a/arch/ia64/kernel/smp.c +++ b/arch/ia64/kernel/smp.c | |||
| @@ -108,7 +108,7 @@ cpu_die(void) | |||
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | irqreturn_t | 110 | irqreturn_t |
| 111 | handle_IPI (int irq, void *dev_id, struct pt_regs *regs) | 111 | handle_IPI (int irq, void *dev_id) |
| 112 | { | 112 | { |
| 113 | int this_cpu = get_cpu(); | 113 | int this_cpu = get_cpu(); |
| 114 | unsigned long *pending_ipis = &__ia64_per_cpu_var(ipi_operation); | 114 | unsigned long *pending_ipis = &__ia64_per_cpu_var(ipi_operation); |
| @@ -328,10 +328,14 @@ int | |||
| 328 | smp_call_function (void (*func) (void *info), void *info, int nonatomic, int wait) | 328 | smp_call_function (void (*func) (void *info), void *info, int nonatomic, int wait) |
| 329 | { | 329 | { |
| 330 | struct call_data_struct data; | 330 | struct call_data_struct data; |
| 331 | int cpus = num_online_cpus()-1; | 331 | int cpus; |
| 332 | 332 | ||
| 333 | if (!cpus) | 333 | spin_lock(&call_lock); |
| 334 | cpus = num_online_cpus() - 1; | ||
| 335 | if (!cpus) { | ||
| 336 | spin_unlock(&call_lock); | ||
| 334 | return 0; | 337 | return 0; |
| 338 | } | ||
| 335 | 339 | ||
| 336 | /* Can deadlock when called with interrupts disabled */ | 340 | /* Can deadlock when called with interrupts disabled */ |
| 337 | WARN_ON(irqs_disabled()); | 341 | WARN_ON(irqs_disabled()); |
| @@ -343,8 +347,6 @@ smp_call_function (void (*func) (void *info), void *info, int nonatomic, int wai | |||
| 343 | if (wait) | 347 | if (wait) |
| 344 | atomic_set(&data.finished, 0); | 348 | atomic_set(&data.finished, 0); |
| 345 | 349 | ||
| 346 | spin_lock(&call_lock); | ||
| 347 | |||
| 348 | call_data = &data; | 350 | call_data = &data; |
| 349 | mb(); /* ensure store to call_data precedes setting of IPI_CALL_FUNC */ | 351 | mb(); /* ensure store to call_data precedes setting of IPI_CALL_FUNC */ |
| 350 | send_IPI_allbutself(IPI_CALL_FUNC); | 352 | send_IPI_allbutself(IPI_CALL_FUNC); |
