diff options
author | Petr Mladek <pmladek@suse.com> | 2021-11-18 10:03:47 +0100 |
---|---|---|
committer | Petr Mladek <pmladek@suse.com> | 2021-11-18 10:03:47 +0100 |
commit | bf6d0d1e1ab38309ea2a234e2e4ba2a18d014af9 (patch) | |
tree | acc97528dc62243c6379d0eb7c8823b861fd968b | |
parent | a0ddee65c527d877e798205c1391c6170e580c66 (diff) | |
parent | 5d5e4522a7f404d1a96fd6c703989d32a9c9568d (diff) | |
download | lwn-bf6d0d1e1ab38309ea2a234e2e4ba2a18d014af9.tar.gz lwn-bf6d0d1e1ab38309ea2a234e2e4ba2a18d014af9.zip |
Merge branch 'rework/printk_safe-removal' into for-linus
-rw-r--r-- | arch/powerpc/kernel/watchdog.c | 6 | ||||
-rw-r--r-- | include/linux/printk.h | 4 | ||||
-rw-r--r-- | kernel/printk/printk.c | 5 | ||||
-rw-r--r-- | lib/nmi_backtrace.c | 6 |
4 files changed, 21 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/watchdog.c b/arch/powerpc/kernel/watchdog.c index f9ea0e5357f9..3fa6d240bade 100644 --- a/arch/powerpc/kernel/watchdog.c +++ b/arch/powerpc/kernel/watchdog.c @@ -187,6 +187,12 @@ static void watchdog_smp_panic(int cpu, u64 tb) 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"); diff --git a/include/linux/printk.h b/include/linux/printk.h index 85b656f82d75..9497f6b98339 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -198,6 +198,7 @@ void dump_stack_print_info(const char *log_lvl); 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 char *log_lvl) static inline void dump_stack(void) { } +static inline void printk_trigger_flush(void) +{ +} #endif #ifdef CONFIG_SMP diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 9e5dfb1896a9..49e3c53ec510 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -3253,6 +3253,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; diff --git a/lib/nmi_backtrace.c b/lib/nmi_backtrace.c index f9e89001b52e..199ab201d501 100644 --- a/lib/nmi_backtrace.c +++ b/lib/nmi_backtrace.c @@ -75,6 +75,12 @@ void nmi_trigger_cpumask_backtrace(const cpumask_t *mask, 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(); } |