sparc64: fatal trap should stop all cpus
"echo c > /proc/sysrq-trigger" does not result in a system crash. There are two problems. One is that the trap handler ignores the global variable, panic_on_oops. The other is that smp_send_stop() is a no-op which leaves the other cpus running normally when one cpu panics. Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8f765b8491
commit
94ab599076
2 changed files with 26 additions and 3 deletions
|
@ -1406,11 +1406,32 @@ void __irq_entry smp_receive_signal_client(int irq, struct pt_regs *regs)
|
||||||
scheduler_ipi();
|
scheduler_ipi();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is a nop because we capture all other cpus
|
static void stop_this_cpu(void *dummy)
|
||||||
* anyways when making the PROM active.
|
{
|
||||||
*/
|
prom_stopself();
|
||||||
|
}
|
||||||
|
|
||||||
void smp_send_stop(void)
|
void smp_send_stop(void)
|
||||||
{
|
{
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
if (tlb_type == hypervisor) {
|
||||||
|
for_each_online_cpu(cpu) {
|
||||||
|
if (cpu == smp_processor_id())
|
||||||
|
continue;
|
||||||
|
#ifdef CONFIG_SUN_LDOMS
|
||||||
|
if (ldom_domaining_enabled) {
|
||||||
|
unsigned long hv_err;
|
||||||
|
hv_err = sun4v_cpu_stop(cpu);
|
||||||
|
if (hv_err)
|
||||||
|
printk(KERN_ERR "sun4v_cpu_stop() "
|
||||||
|
"failed err=%lu\n", hv_err);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
prom_stopcpu_cpuid(cpu);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
smp_call_function(stop_this_cpu, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2427,6 +2427,8 @@ void __noreturn die_if_kernel(char *str, struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
user_instruction_dump ((unsigned int __user *) regs->tpc);
|
user_instruction_dump ((unsigned int __user *) regs->tpc);
|
||||||
}
|
}
|
||||||
|
if (panic_on_oops)
|
||||||
|
panic("Fatal exception");
|
||||||
if (regs->tstate & TSTATE_PRIV)
|
if (regs->tstate & TSTATE_PRIV)
|
||||||
do_exit(SIGKILL);
|
do_exit(SIGKILL);
|
||||||
do_exit(SIGSEGV);
|
do_exit(SIGSEGV);
|
||||||
|
|
Loading…
Add table
Reference in a new issue