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); |