lkml.org 
[lkml]   [2021]   [Nov]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 227/279] printk: restore flushing of NMI buffers on remote CPUs after NMI backtraces
    Date
    From: Nicholas Piggin <npiggin@gmail.com>

    commit 5d5e4522a7f404d1a96fd6c703989d32a9c9568d upstream.

    printk from NMI context relies on irq work being raised on the local CPU
    to print to console. This can be a problem if the NMI was raised by a
    lockup detector to print lockup stack and regs, because the CPU may not
    enable irqs (because it is locked up).

    Introduce printk_trigger_flush() that can be called another CPU to try
    to get those messages to the console, call that where printk_safe_flush
    was previously called.

    Fixes: 93d102f094be ("printk: remove safe buffers")
    Cc: stable@vger.kernel.org # 5.15
    Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
    Reviewed-by: Petr Mladek <pmladek@suse.com>
    Reviewed-by: John Ogness <john.ogness@linutronix.de>
    Signed-off-by: Petr Mladek <pmladek@suse.com>
    Link: https://lore.kernel.org/r/20211107045116.1754411-1-npiggin@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/powerpc/kernel/watchdog.c | 6 ++++++
    include/linux/printk.h | 4 ++++
    kernel/printk/printk.c | 5 +++++
    lib/nmi_backtrace.c | 6 ++++++
    4 files changed, 21 insertions(+)

    --- a/arch/powerpc/kernel/watchdog.c
    +++ b/arch/powerpc/kernel/watchdog.c
    @@ -187,6 +187,12 @@ static void watchdog_smp_panic(int cpu,
    if (sysctl_hardlockup_all_cpu_backtrace)
    trigger_allbutself_cpu_backtrace();

    + /*
    + * Force flush any remote buffers that might be stuck in IRQ context
    + * and therefore could not run their irq_work.
    + */
    + printk_trigger_flush();
    +
    if (hardlockup_panic)
    nmi_panic(NULL, "Hard LOCKUP");

    --- a/include/linux/printk.h
    +++ b/include/linux/printk.h
    @@ -198,6 +198,7 @@ void dump_stack_print_info(const char *l
    void show_regs_print_info(const char *log_lvl);
    extern asmlinkage void dump_stack_lvl(const char *log_lvl) __cold;
    extern asmlinkage void dump_stack(void) __cold;
    +void printk_trigger_flush(void);
    #else
    static inline __printf(1, 0)
    int vprintk(const char *s, va_list args)
    @@ -274,6 +275,9 @@ static inline void dump_stack_lvl(const
    static inline void dump_stack(void)
    {
    }
    +static inline void printk_trigger_flush(void)
    +{
    +}
    #endif

    #ifdef CONFIG_SMP
    --- a/kernel/printk/printk.c
    +++ b/kernel/printk/printk.c
    @@ -3252,6 +3252,11 @@ void defer_console_output(void)
    preempt_enable();
    }

    +void printk_trigger_flush(void)
    +{
    + defer_console_output();
    +}
    +
    int vprintk_deferred(const char *fmt, va_list args)
    {
    int r;
    --- a/lib/nmi_backtrace.c
    +++ b/lib/nmi_backtrace.c
    @@ -75,6 +75,12 @@ void nmi_trigger_cpumask_backtrace(const
    touch_softlockup_watchdog();
    }

    + /*
    + * Force flush any remote buffers that might be stuck in IRQ context
    + * and therefore could not run their irq_work.
    + */
    + printk_trigger_flush();
    +
    clear_bit_unlock(0, &backtrace_flag);
    put_cpu();
    }

    \
     
     \ /
      Last update: 2021-11-24 15:05    [W:4.114 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site