powerpc: Remove call sites of MSG_ALL_BUT_SELF
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>
This commit is contained in:
parent
2a116f3dd0
commit
e047637132
4 changed files with 16 additions and 9 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue