Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 94ab5990 authored by Dave Kleikamp's avatar Dave Kleikamp Committed by David S. Miller
Browse files

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: default avatarDave Kleikamp <dave.kleikamp@oracle.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8f765b84
Loading
Loading
Loading
Loading
+24 −3
Original line number Diff line number Diff line
@@ -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);
}

/**
+2 −0
Original line number Diff line number Diff line
@@ -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);