• P
    printk/nmi: flush NMI messages on the system panic · cf9b1106
    Petr Mladek 提交于
    In NMI context, printk() messages are stored into per-CPU buffers to
    avoid a possible deadlock.  They are normally flushed to the main ring
    buffer via an IRQ work.  But the work is never called when the system
    calls panic() in the very same NMI handler.
    
    This patch tries to flush NMI buffers before the crash dump is
    generated.  In this case it does not risk a double release and bails out
    when the logbuf_lock is already taken.  The aim is to get the messages
    into the main ring buffer when possible.  It makes them better
    accessible in the vmcore.
    
    Then the patch tries to flush the buffers second time when other CPUs
    are down.  It might be more aggressive and reset logbuf_lock.  The aim
    is to get the messages available for the consequent kmsg_dump() and
    console_flush_on_panic() calls.
    
    The patch causes vprintk_emit() to be called even in NMI context again.
    But it is done via printk_deferred() so that the console handling is
    skipped.  Consoles use internal locks and we could not prevent a
    deadlock easily.  They are explicitly called later when the crash dump
    is not generated, see console_flush_on_panic().
    Signed-off-by: NPetr Mladek <pmladek@suse.com>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Daniel Thompson <daniel.thompson@linaro.org>
    Cc: David Miller <davem@davemloft.net>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jiri Kosina <jkosina@suse.com>
    Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: Russell King <rmk+kernel@arm.linux.org.uk>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    cf9b1106
internal.h 1.6 KB