diff options
Diffstat (limited to 'debian/patches-rt/0031-printk-Coordinate-direct-printing-in-panic.patch')
-rw-r--r-- | debian/patches-rt/0031-printk-Coordinate-direct-printing-in-panic.patch | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/debian/patches-rt/0031-printk-Coordinate-direct-printing-in-panic.patch b/debian/patches-rt/0031-printk-Coordinate-direct-printing-in-panic.patch new file mode 100644 index 0000000000..6f26bf7fc6 --- /dev/null +++ b/debian/patches-rt/0031-printk-Coordinate-direct-printing-in-panic.patch @@ -0,0 +1,134 @@ +From: John Ogness <john.ogness@linutronix.de> +Date: Wed, 22 Nov 2023 11:56:58 +0000 +Subject: [PATCH 31/50] printk: Coordinate direct printing in panic +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.7/older/patches-6.7-rt6.tar.xz + +Perform printing by nbcon consoles on the panic CPU from the +printk() caller context in order to get panic messages printed +as soon as possible. + +If legacy and nbcon consoles are registered, the legacy consoles +will no longer perform direct printing on the panic CPU until +after the backtrace has been stored. This will give the safe +nbcon consoles a chance to print the panic messages before +allowing the unsafe legacy consoles to print. + +If no nbcon consoles are registered, there is no change in +behavior (i.e. legacy consoles will always attempt to print +from the printk() caller context). + +Signed-off-by: John Ogness <john.ogness@linutronix.de> +Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +--- + include/linux/printk.h | 2 + + kernel/panic.c | 2 + + kernel/printk/printk.c | 53 ++++++++++++++++++++++++++++++++++++++++++------- + 3 files changed, 50 insertions(+), 7 deletions(-) + +--- a/include/linux/printk.h ++++ b/include/linux/printk.h +@@ -782,3 +782,5 @@ static inline void print_hex_dump_debug( + print_hex_dump_debug(prefix_str, prefix_type, 16, 1, buf, len, true) + + #endif ++ ++void printk_legacy_allow_panic_sync(void); +--- a/kernel/panic.c ++++ b/kernel/panic.c +@@ -370,6 +370,8 @@ void panic(const char *fmt, ...) + */ + atomic_notifier_call_chain(&panic_notifier_list, 0, buf); + ++ printk_legacy_allow_panic_sync(); ++ + panic_print_sys_info(false); + + kmsg_dump(KMSG_DUMP_PANIC); +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -2329,12 +2329,23 @@ int vprintk_store(int facility, int leve + return ret; + } + ++static bool legacy_allow_panic_sync; ++ ++/* ++ * This acts as a one-way switch to allow legacy consoles to print from ++ * the printk() caller context on a panic CPU. ++ */ ++void printk_legacy_allow_panic_sync(void) ++{ ++ legacy_allow_panic_sync = true; ++} ++ + asmlinkage int vprintk_emit(int facility, int level, + const struct dev_printk_info *dev_info, + const char *fmt, va_list args) + { ++ bool do_trylock_unlock = printing_via_unlock; + int printed_len; +- bool in_sched = false; + + /* Suppress unimportant messages after panic happens */ + if (unlikely(suppress_printk)) +@@ -2350,15 +2361,43 @@ asmlinkage int vprintk_emit(int facility + + if (level == LOGLEVEL_SCHED) { + level = LOGLEVEL_DEFAULT; +- in_sched = true; ++ /* If called from the scheduler, we can not call up(). */ ++ do_trylock_unlock = false; + } + + printk_delay(level); + + printed_len = vprintk_store(facility, level, dev_info, fmt, args); + +- /* If called from the scheduler, we can not call up(). */ +- if (!in_sched && printing_via_unlock) { ++ if (!have_boot_console && have_nbcon_console) { ++ bool is_panic_context = this_cpu_in_panic(); ++ ++ /* ++ * In panic, the legacy consoles are not allowed to print from ++ * the printk calling context unless explicitly allowed. This ++ * gives the safe nbcon consoles a chance to print out all the ++ * panic messages first. This restriction only applies if ++ * there are nbcon consoles registered. ++ */ ++ if (is_panic_context) ++ do_trylock_unlock &= legacy_allow_panic_sync; ++ ++ /* ++ * There are situations where nbcon atomic printing should ++ * happen in the printk() caller context: ++ * ++ * - When this CPU is in panic. ++ * ++ * Note that if boot consoles are registered, the ++ * console_lock/console_unlock dance must be relied upon ++ * instead because nbcon consoles cannot print simultaneously ++ * with boot consoles. ++ */ ++ if (is_panic_context) ++ nbcon_atomic_flush_all(); ++ } ++ ++ if (do_trylock_unlock) { + /* + * The caller may be holding system-critical or + * timing-sensitive locks. Disable preemption during +@@ -2378,10 +2417,10 @@ asmlinkage int vprintk_emit(int facility + preempt_enable(); + } + +- if (in_sched) +- defer_console_output(); +- else ++ if (do_trylock_unlock) + wake_up_klogd(); ++ else ++ defer_console_output(); + + return printed_len; + } |