powerpc/pseries, ps3: panic flush kernel messages before halting system
Platforms with a panic handler that halts the system can have problems getting kernel messages out, because the panic notifiers are called before kernel/panic.c does its flushing of printk buffers an console etc. This was attempted to be solved with commita3b2cb30f2
("powerpc: Do not call ppc_md.panic in fadump panic notifier"), but that wasn't the right approach and caused other problems, and was reverted by commitab9dbf771f
. Instead, the powernv shutdown paths have already had a similar problem, fixed by taking the message flushing sequence from kernel/panic.c. That's a little bit ugly, but while we have the code duplicated, it will work for this case as well. So have ppc panic handlers do the same flushing before they terminate. Without this patch, a qemu pseries_le_defconfig guest stops silently when issued the nmi command when xmon is off and no crash dumpers enabled. Afterwards, an oops is printed by each CPU as expected. Fixes:ab9dbf771f
("Revert "powerpc: Do not call ppc_md.panic in fadump panic notifier"") Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:

committed by
Michael Ellerman

parent
a08082f8e4
commit
35adacd6fc
@@ -39,6 +39,8 @@
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/context_tracking.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/kmsg_dump.h>
|
||||
|
||||
#include <asm/emulated_ops.h>
|
||||
#include <asm/pgtable.h>
|
||||
@@ -143,6 +145,28 @@ static int die_owner = -1;
|
||||
static unsigned int die_nest_count;
|
||||
static int die_counter;
|
||||
|
||||
extern void panic_flush_kmsg_start(void)
|
||||
{
|
||||
/*
|
||||
* These are mostly taken from kernel/panic.c, but tries to do
|
||||
* relatively minimal work. Don't use delay functions (TB may
|
||||
* be broken), don't crash dump (need to set a firmware log),
|
||||
* don't run notifiers. We do want to get some information to
|
||||
* Linux console.
|
||||
*/
|
||||
console_verbose();
|
||||
bust_spinlocks(1);
|
||||
}
|
||||
|
||||
extern void panic_flush_kmsg_end(void)
|
||||
{
|
||||
printk_safe_flush_on_panic();
|
||||
kmsg_dump(KMSG_DUMP_PANIC);
|
||||
bust_spinlocks(0);
|
||||
debug_locks_off();
|
||||
console_flush_on_panic();
|
||||
}
|
||||
|
||||
static unsigned long oops_begin(struct pt_regs *regs)
|
||||
{
|
||||
int cpu;
|
||||
|
Reference in New Issue
Block a user