The equivalent to smp_receive_signal_client() on x86
(smp_reschedule_interrupt) doesn't do an irq_enter() either.
However x86 does do an irq_enter() for smp_call_function() interrupt
handling.
What is the rule in these cases?
Anyways, does the following patch fix the problem?
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
index 524b889..bf4ef84 100644
--- a/arch/sparc64/kernel/smp.c
+++ b/arch/sparc64/kernel/smp.c
@@ -866,14 +866,21 @@ void smp_call_function_client(int irq, struct pt_regs *regs)
void *info = call_data->info;
clear_softint(1 << irq);
+
+ irq_enter();
+
+ if (!call_data->wait) {
+ /* let initiator proceed after getting data */
+ atomic_inc(&call_data->finished);
+ }
+
+ func(info);
+
+ irq_exit();
+
if (call_data->wait) {
/* let initiator proceed only after completion */
- func(info);
- atomic_inc(&call_data->finished);
- } else {
- /* let initiator proceed after getting data */
atomic_inc(&call_data->finished);
- func(info);
}
}
--