All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V3] sparc64: fatal trap should stop all cpus
@ 2015-01-07  0:31 Dave Kleikamp
  0 siblings, 0 replies; 2+ messages in thread
From: Dave Kleikamp @ 2015-01-07  0:31 UTC (permalink / raw)
  To: sparclinux

"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>
---
 arch/sparc/kernel/smp_64.c   |   27 ++++++++++++++++++++++++---
 arch/sparc/kernel/traps_64.c |    2 ++
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
index da6f1a7..61139d9 100644
--- a/arch/sparc/kernel/smp_64.c
+++ b/arch/sparc/kernel/smp_64.c
@@ -1406,11 +1406,32 @@ void __irq_entry smp_receive_signal_client(int irq, struct pt_regs *regs)
 	scheduler_ipi();
 }
 
-/* This is a nop because we capture all other cpus
- * anyways when making the PROM active.
- */
+static void stop_this_cpu(void *dummy)
+{
+	prom_stopself();
+}
+
 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);
 }
 
 /**
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c
index 981a769..5555dd6 100644
--- a/arch/sparc/kernel/traps_64.c
+++ b/arch/sparc/kernel/traps_64.c
@@ -2427,6 +2427,8 @@ void __noreturn die_if_kernel(char *str, struct pt_regs *regs)
 		}
 		user_instruction_dump ((unsigned int __user *) regs->tpc);
 	}
+	if (panic_on_oops)
+		panic("Fatal exception");
 	if (regs->tstate & TSTATE_PRIV)
 		do_exit(SIGKILL);
 	do_exit(SIGSEGV);
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH V3] sparc64: fatal trap should stop all cpus
@ 2015-03-02  5:43 David Miller
  0 siblings, 0 replies; 2+ messages in thread
From: David Miller @ 2015-03-02  5:43 UTC (permalink / raw)
  To: sparclinux

From: Dave Kleikamp <dave.kleikamp@oracle.com>
Date: Tue, 06 Jan 2015 18:31:39 -0600

> "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>

This looks good, thanks for following up on this.

Applied, thanks again.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-03-02  5:43 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-07  0:31 [PATCH V3] sparc64: fatal trap should stop all cpus Dave Kleikamp
  -- strict thread matches above, loose matches on Subject: below --
2015-03-02  5:43 David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.