Commit ab9dbf77 authored by David Gibson's avatar David Gibson Committed by Michael Ellerman

Revert "powerpc: Do not call ppc_md.panic in fadump panic notifier"

This reverts commit a3b2cb30.

That commit tried to fix problems with panic on powerpc in certain
circumstances, where some output from the generic panic code was being
dropped.

Unfortunately, it breaks things worse in other circumstances. In
particular when running a PAPR guest, it will now attempt to reboot
instead of informing the hypervisor (KVM or PowerVM) that the guest
has crashed. The crash notification is important to some
virtualization management layers.

Revert it for now until we can come up with a better solution.

Fixes: a3b2cb30 ("powerpc: Do not call ppc_md.panic in fadump panic notifier")
Cc: stable@vger.kernel.org # v4.14+
Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
[mpe: Tweak change log a bit]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 5aa04b3e
...@@ -76,6 +76,7 @@ struct machdep_calls { ...@@ -76,6 +76,7 @@ struct machdep_calls {
void __noreturn (*restart)(char *cmd); void __noreturn (*restart)(char *cmd);
void __noreturn (*halt)(void); void __noreturn (*halt)(void);
void (*panic)(char *str);
void (*cpu_die)(void); void (*cpu_die)(void);
long (*time_init)(void); /* Optional, may be NULL */ long (*time_init)(void); /* Optional, may be NULL */
......
...@@ -24,6 +24,7 @@ extern void reloc_got2(unsigned long); ...@@ -24,6 +24,7 @@ extern void reloc_got2(unsigned long);
void check_for_initrd(void); void check_for_initrd(void);
void initmem_init(void); void initmem_init(void);
void setup_panic(void);
#define ARCH_PANIC_TIMEOUT 180 #define ARCH_PANIC_TIMEOUT 180
#ifdef CONFIG_PPC_PSERIES #ifdef CONFIG_PPC_PSERIES
......
...@@ -1462,25 +1462,6 @@ static void fadump_init_files(void) ...@@ -1462,25 +1462,6 @@ static void fadump_init_files(void)
return; return;
} }
static int fadump_panic_event(struct notifier_block *this,
unsigned long event, void *ptr)
{
/*
* If firmware-assisted dump has been registered then trigger
* firmware-assisted dump and let firmware handle everything
* else. If this returns, then fadump was not registered, so
* go through the rest of the panic path.
*/
crash_fadump(NULL, ptr);
return NOTIFY_DONE;
}
static struct notifier_block fadump_panic_block = {
.notifier_call = fadump_panic_event,
.priority = INT_MIN /* may not return; must be done last */
};
/* /*
* Prepare for firmware-assisted dump. * Prepare for firmware-assisted dump.
*/ */
...@@ -1513,9 +1494,6 @@ int __init setup_fadump(void) ...@@ -1513,9 +1494,6 @@ int __init setup_fadump(void)
init_fadump_mem_struct(&fdm, fw_dump.reserve_dump_area_start); init_fadump_mem_struct(&fdm, fw_dump.reserve_dump_area_start);
fadump_init_files(); fadump_init_files();
atomic_notifier_chain_register(&panic_notifier_list,
&fadump_panic_block);
return 1; return 1;
} }
subsys_initcall(setup_fadump); subsys_initcall(setup_fadump);
...@@ -704,6 +704,30 @@ int check_legacy_ioport(unsigned long base_port) ...@@ -704,6 +704,30 @@ int check_legacy_ioport(unsigned long base_port)
} }
EXPORT_SYMBOL(check_legacy_ioport); EXPORT_SYMBOL(check_legacy_ioport);
static int ppc_panic_event(struct notifier_block *this,
unsigned long event, void *ptr)
{
/*
* If firmware-assisted dump has been registered then trigger
* firmware-assisted dump and let firmware handle everything else.
*/
crash_fadump(NULL, ptr);
ppc_md.panic(ptr); /* May not return */
return NOTIFY_DONE;
}
static struct notifier_block ppc_panic_block = {
.notifier_call = ppc_panic_event,
.priority = INT_MIN /* may not return; must be done last */
};
void __init setup_panic(void)
{
if (!ppc_md.panic)
return;
atomic_notifier_chain_register(&panic_notifier_list, &ppc_panic_block);
}
#ifdef CONFIG_CHECK_CACHE_COHERENCY #ifdef CONFIG_CHECK_CACHE_COHERENCY
/* /*
* For platforms that have configurable cache-coherency. This function * For platforms that have configurable cache-coherency. This function
...@@ -848,6 +872,9 @@ void __init setup_arch(char **cmdline_p) ...@@ -848,6 +872,9 @@ void __init setup_arch(char **cmdline_p)
/* Probe the machine type, establish ppc_md. */ /* Probe the machine type, establish ppc_md. */
probe_machine(); probe_machine();
/* Setup panic notifier if requested by the platform. */
setup_panic();
/* /*
* Configure ppc_md.power_save (ppc32 only, 64-bit machines do * Configure ppc_md.power_save (ppc32 only, 64-bit machines do
* it from their respective probe() function. * it from their respective probe() function.
......
...@@ -104,6 +104,20 @@ static void __noreturn ps3_halt(void) ...@@ -104,6 +104,20 @@ static void __noreturn ps3_halt(void)
ps3_sys_manager_halt(); /* never returns */ ps3_sys_manager_halt(); /* never returns */
} }
static void ps3_panic(char *str)
{
DBG("%s:%d %s\n", __func__, __LINE__, str);
smp_send_stop();
printk("\n");
printk(" System does not reboot automatically.\n");
printk(" Please press POWER button.\n");
printk("\n");
while(1)
lv1_pause(1);
}
#if defined(CONFIG_FB_PS3) || defined(CONFIG_FB_PS3_MODULE) || \ #if defined(CONFIG_FB_PS3) || defined(CONFIG_FB_PS3_MODULE) || \
defined(CONFIG_PS3_FLASH) || defined(CONFIG_PS3_FLASH_MODULE) defined(CONFIG_PS3_FLASH) || defined(CONFIG_PS3_FLASH_MODULE)
static void __init prealloc(struct ps3_prealloc *p) static void __init prealloc(struct ps3_prealloc *p)
...@@ -255,6 +269,7 @@ define_machine(ps3) { ...@@ -255,6 +269,7 @@ define_machine(ps3) {
.probe = ps3_probe, .probe = ps3_probe,
.setup_arch = ps3_setup_arch, .setup_arch = ps3_setup_arch,
.init_IRQ = ps3_init_IRQ, .init_IRQ = ps3_init_IRQ,
.panic = ps3_panic,
.get_boot_time = ps3_get_boot_time, .get_boot_time = ps3_get_boot_time,
.set_dabr = ps3_set_dabr, .set_dabr = ps3_set_dabr,
.calibrate_decr = ps3_calibrate_decr, .calibrate_decr = ps3_calibrate_decr,
......
...@@ -726,6 +726,7 @@ define_machine(pseries) { ...@@ -726,6 +726,7 @@ define_machine(pseries) {
.pcibios_fixup = pSeries_final_fixup, .pcibios_fixup = pSeries_final_fixup,
.restart = rtas_restart, .restart = rtas_restart,
.halt = rtas_halt, .halt = rtas_halt,
.panic = rtas_os_term,
.get_boot_time = rtas_get_boot_time, .get_boot_time = rtas_get_boot_time,
.get_rtc_time = rtas_get_rtc_time, .get_rtc_time = rtas_get_rtc_time,
.set_rtc_time = rtas_set_rtc_time, .set_rtc_time = rtas_set_rtc_time,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment