powerpc: Remove call sites of MSG_ALL_BUT_SELF
authorMilton Miller <miltonm@bga.com>
Tue, 10 May 2011 19:29:06 +0000 (19:29 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 19 May 2011 04:30:46 +0000 (14:30 +1000)
The only user of MSG_ALL_BUT_SELF in the whole kernel tree is powerpc,
and it only uses it to start the debugger. Both debuggers always call
smp_send_debugger_break with MSG_ALL_BUT_SELF, and only mpic can do
anything more optimal than a loop over all online cpus, but all message
passing implementations have to code for this special delivery target.

Convert smp_send_debugger_break to take void and loop calling the smp_ops
message_pass function for each of the other cpus in the online cpumask.

Use raw_smp_processor_id() because we are either entering the debugger
or trying to start kdump and the additional warning it not useful were
it to trigger.

Signed-off-by: Milton Miller <miltonm@bga.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/smp.h
arch/powerpc/kernel/kgdb.c
arch/powerpc/kernel/smp.c
arch/powerpc/xmon/xmon.c

index 50873493a97c72949a712998fce878b5f7a00972..91472c56800f524dba5bb0fe8a0bcca717c31f54 100644 (file)
@@ -35,7 +35,7 @@ extern void cpu_die(void);
 
 #ifdef CONFIG_SMP
 
-extern void smp_send_debugger_break(int cpu);
+extern void smp_send_debugger_break(void);
 extern void smp_message_recv(int);
 extern void start_secondary_resume(void);
 
index 42850ee00adabfa33f0bb5ccd69efe1388d8ec96..bd9d35f59cf430886cf0f748cd1df72701c84ff8 100644 (file)
@@ -109,7 +109,7 @@ static int kgdb_call_nmi_hook(struct pt_regs *regs)
 #ifdef CONFIG_SMP
 void kgdb_roundup_cpus(unsigned long flags)
 {
-       smp_send_debugger_break(MSG_ALL_BUT_SELF);
+       smp_send_debugger_break();
 }
 #endif
 
index 87517ab6d36501363c7e02dc252a9e3c7d0f9441..b74411446922dd466eda1eb8cbe52f381d546248 100644 (file)
@@ -218,11 +218,18 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
                smp_ops->message_pass(cpu, PPC_MSG_CALL_FUNCTION);
 }
 
-#ifdef CONFIG_DEBUGGER
-void smp_send_debugger_break(int cpu)
+#if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
+void smp_send_debugger_break(void)
 {
-       if (likely(smp_ops))
-               smp_ops->message_pass(cpu, PPC_MSG_DEBUGGER_BREAK);
+       int cpu;
+       int me = raw_smp_processor_id();
+
+       if (unlikely(!smp_ops))
+               return;
+
+       for_each_online_cpu(cpu)
+               if (cpu != me)
+                       smp_ops->message_pass(cpu, PPC_MSG_DEBUGGER_BREAK);
 }
 #endif
 
@@ -230,9 +237,9 @@ void smp_send_debugger_break(int cpu)
 void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *))
 {
        crash_ipi_function_ptr = crash_ipi_callback;
-       if (crash_ipi_callback && smp_ops) {
+       if (crash_ipi_callback) {
                mb();
-               smp_ops->message_pass(MSG_ALL_BUT_SELF, PPC_MSG_DEBUGGER_BREAK);
+               smp_send_debugger_break();
        }
 }
 #endif
index 91309c5c00d7d18fd968a293d7e02637d666b051..42541bbcc7fa551b81254f9e4068870b0596a35c 100644 (file)
@@ -437,7 +437,7 @@ static int xmon_core(struct pt_regs *regs, int fromipi)
                xmon_owner = cpu;
                mb();
                if (ncpus > 1) {
-                       smp_send_debugger_break(MSG_ALL_BUT_SELF);
+                       smp_send_debugger_break();
                        /* wait for other cpus to come in */
                        for (timeout = 100000000; timeout != 0; --timeout) {
                                if (cpumask_weight(&cpus_in_xmon) >= ncpus)